PDA

View Full Version : اصول طراحی یک کپچای تصویری امن



eshpilen
شنبه 26 آذر 1390, 10:40 صبح
بنده چند وقت پیش که برای پروژهء خودم دنبال یک کپچای مناسب بودم از خودم پرسیدم واقعا یک کپچا باید با حرف و زمینه چکار بکنه تا بالاترین امنیت رو داشته باشه؟ آیا اینکه هرکس دوتا خال و خط و رنگ تصادفی میندازه واقعا معلوم هست چقدر تاثیر داره یا نه، و واقعا اصول دقیق و علمی نداره این کار که هرکس هرکار خواست میکنه و اسمش رو میذاره کپچا؟
خب بجز اینها البته چگونگی دشوار کردن خواندن خود حروف به تنهایی هم مهمه. یعنی بدون در نظر گرفتن زمینه یا چیزهایی که روی حروف کشیده میشن.
اما واقعا چه کار باید کرد تا کار برای الگوریتم های پردازش متن تا حداکثر ممکن دشوار بشه اما هنوز برای انسان با سهولت کافی قابل تشخیص باشه.
آیا اگر خواندن چیزی بنظر ما سخت میاد، لزوما برای برنامه های پردازش تصویر هم سخته؟
تازه خواندن بیشتر کپچاها که برای ما راحت هست.

یه مقاله یجا توضیحاتی در مورد اصول ساخت کپچا داده بود که بد نبود.

البته مقالهء ویکیپدیا (http://en.wikipedia.org/wiki/Captcha) هم توضیحات خوبی داشت.
مقالهء ویکیپدیا میگه:

A number of research projects have attempted (often successfully) to beat visual CAPTCHAs by creating programs that contain the following functionality:

Pre-processing: Removal of background clutter and noise.
Segmentation: Splitting the image into regions which each contain a single character.
Classification: Identifying the character in each region.

Steps 1 and 3 are easy tasks for computers.[7] The only step where humans still outperform computers is segmentation. If the background clutter consists of shapes similar to letter shapes, and the letters are connected by this clutter, the segmentation becomes nearly impossible with current software. Hence, an effective CAPTCHA should focus on the segmentation.

ترجمه:
« تعدادی پروژهء تحقیقاتی اغلب با موفقیت تلاش کرده اند تا کپچاهای تصویری را بوسیلهء برنامه هایی که دارای کارکردهای زیر هستند کرک کنند:
1- پیش پردازش: حذف درهم ریختگی و پارازیت زمینه.
2- قطعه بندی: تقسیم تصویر به ناحیه هایی که هرکدام محتوی یک کاراکتر هستند.
3- طبقه بندی: تشخیص کاراکتری که در هر ناحیه است.
قدمهای 1 و 3 کارهای آسانی برای رایانه ها هستند. تنها قدمی که در آن انسانها هنوز از رایانه ها قویتر هستند قطعه بندی است. اگر درهم ریختگی زمینه از اشکالی شبیه اشکال حروف تشکیل شده باشد، و حروف بوسیلهء این درهم ریختگی متصل شده باشند، قطعه بندی توسط نرم افزارهای فعلی تقریبا غیرممکن میشود. از اینرو، یک کپچای موثر باید بر روی قطعه بندی تمرکز کند. »

خب این نکات و اصول جالب و مهم رو در مقالهء دیگر هم که گفتم خوندم. البته اون فقط گفته بود که رنگ خطهای تصادفی ای که در زمینه ایجاد میکنیم باید با رنگ کاراکترها یکی باشه تا نشه اون خطوط رو براحتی با استفاده از تشخیص رنگ از کاراکترها تفکیک کرد، و به شباهت اشکال تصادفی زمینه به کاراکترها اشاره نکرده بود. از طرف دیگه به این نکتهء رنگ هم در مقالهء ویکیپدیا اشاره نشده، اما فکر میکنم بقدر کافی روشن باشه که باید رنگ پارازیت و رنگ کاراکترهای کپچا دقیقا یکسان باشه. وگرنه یک نرم افزار میتونه از تفاوت رنگ براحتی استفاده کنه و کار حذف پارازیت براش خیلی راحتتر میشه.

پس نتیجه میگیریم که باید پارازیت هایی ایجاد کنیم که 1) رنگ اونها با رنگ کاراکترهای کد امنیتی دقیقا یکسان باشه 2) باید این پارازیت ها با کاراکترها شباهت داشته باشن.

ضمنا دشوار کردن قطعه بندی (Segmentation) لزوما یا فقط با درهم آمیختگی زمینه انجام نمیشه و حتما کپچاهایی رو دیدید که خود کاراکترها رو به هم میچسبونن و حتی کاراکترها تاحدی در هم داخل میشن یا بعضی از انوع دیگر یک خط منحنی روی کاراکترها میکشن (نمونش در مقالهء ویکیپدیا هست). فکر میکنم اینها هم روشهایی برای دشوار کردن Segmentation هست.

جالب اینه که اگر کپچاهای موجود رو بررسی کنید بنظرم متوجه میشید که بیشتر اونها این اصول رو رعایت نکردن و یحتمل کرک کردن اونها باید خیلی راحت باشه!
هرکس از راه میرسه فکر میکنه چنتا نقطه و خط و پارازیت بندازه و رنگ کاراکترها و پارازیت ها رو عوض کنه این میشه یک کپچا. البته بعضی پیچیده تر هستن و سعی میکنن شکل خود حروف رو هم دچار اعوجاج کنن (جدا از اثر جانبی قاطی شدن پارازیت و درهم ریختگی زمینه با کاراکترها).
هرچیزی یه اصول علمی داره. نیاز به تحقیق و درک طرز کارش داره.
بنظرم کپچاهایی که بیشتر افراد طراحی میکنن بیشتر یه بازی با اشکال و رنگهای تصادفی هست و جنبهء تزیینی داره تا چیز دیگه! حداقلش میشه گفت خیلی از کارهایی که روی این کپچاها انجام میشه بیهوده یا دارای اثر کمی در زمینهء امنیت اونهاست. حالا باید امنیت کلیشون رو مورد به مورد بررسی و تحلیل کرد که مسلما به الگوریتم استفاده شده هم برمیگرده. بهرحال چیزی که هست اینه که به خیلی از اون کارها نیازی نیست (بخصوص اگر خواندن رو برای انسانها دشوارتر میکنن) یا اینکه باید طبق اصول صحیح انجام بشن.

بطور مثال یه نگاهی به کپچای ارائه شده در این تاپیک میندازیم:
http://forum.iranphp.org/Thread-my-captcha
در این مورد چیزی که واضح هست اینه که یک برنامه میتونه خطها/پارازیت زمینه رو از حروف براحتی تفکیک کنه. چون رنگ اونها متفاوت و رنگ هرکدام مشخص و ثابت هست. ضمنا خطهای رسم شده حتی روی حروف هم رسم نشدن که حداقل شکل کاراکترها رو در اون مناطق گسیخته و کمی مخدوش بکنن؛ یعنی هیچ تداخلی در کاراکترها ایجاد نمیکنن.

خب شما هم میتونید تحلیل و ایده ها و دانسته های خودتون رو در این موضوع مطرح کنید.
ضمنا بعد میتونیم روی روشهای پیاده سازی هم بحث کنیم.
مثلا من فکر میکنم برای ایجاد اشکالی در زمینه که با کاراکترها شباهت داشته باشن میتونیم از اشکال کاراکترهای واقعی بعنوان نمونهء اولیه استفاده کنیم. یعنی مثلا تصویر یکسری کاراکتر رو بعنوان پارازیت زمینه ایجاد کرده و میتونیم یکسری مخدوش سازی هایی هم روی اونا انجام بدیم، مثلا بخشهایی از اونا رو پاک کنیم، روشون خط و پارازیت بندازیم، شکل اونها رو دچار اعوجاج کنیم، و بعد این اشکال رو بصورت رندوم در زمینه درج میکنیم بطوریکه با اطمینان یا احتمال بالایی با کاراکترهای واقعی تصادم پیدا کنن. ضمنا اگر عامل رندوم بودن رو در مکان و زاویهء کاراکترهای واقعی هم کم و بیش اعمال کنیم، بنظرم Segmentation بسیار دشوارتر خواهد شد.

eshpilen
شنبه 26 آذر 1390, 10:50 صبح
من که بعد از هر رد شدن کپچایی به reCaptcha رسیدم. همونطور که از کپچای این سایت هم رد می شدن و آخرش ریکپچا که توسط گوگل ارائه شده تونسته جلوی این اسپم ها رو بگیره.
من ترجیح میدم کپچای مستقل خودم رو داشته باشم.
البته نه اینکه لزوما خودم بنویسم، بلکه میگم پروژه باید تاحد امکان خودش کامل و مستقل باشه و به منابع خارجی و سرویسهای آنلاین و سایتهای دیگر وابستگی نداشته باشه.
بنظرم کپچا اونقدری چیز بزرگ و پیچیده و پرهزینه ای نیست که بخوایم بخاطرش پروژهء خودمون رو به سایت و سرویس دیگری پیوند بدیم. این کار از نظر فنی و سیاسی و مسائل جانبی دیگر درکل جالب نیست بنظر بنده.
هرچی پروژه مستقل تر باشه خب بهتره بطور معمول.
مثلا یوقت دیدی مثلا اشتباها یا عمدا اون بخش گوگل یا هر سرویس دیگری که شما استفاده میکنی هیتلر شد.
ضمنا از نظر تست و توسعه هم کپچایی که جزء خود پروژه باشه بهتره چون میشه آفلاین این کارها رو انجام داد.
و احتمالا مزایا و مشکلات دیگری هم هست که بنده حضور ذهن ندارم یا در جریان بعضی تجربه ها و شرایط واقعی روشن میشن.

اینکه کپچاهای شما کرک شدن احتمالا بخاطر این بوده که هیچکدام بقدر کافی روی اصول، و کار کامل و قوی ای نبودن. البته بنده خودم هم در پیدا کردن چنین کپچایی دچار مشکل شدم و هنوزم یک مورد که بنظرم بقدر کافی اصولی باشه پیدا نکردم. خودمم که وقت و حوصلهء طراحی و پیاده سازی کپچا رو ندارم الان؛ بنظرم کار خیلی راحت و کم حجمی نیست اگر بخواد واقعا کامل باشه و از امنیت بالاش مطمئن باشیم.
بعضی از کپچاها ظاهرا پیچیده و مفصل هستن، اما من دنبال یه چیز کوچکتر هستم (مثلا گزینهء صوتی نداشت هم مهم نیست) و ضمنا اساسا شک دارم که این پیچیدگی و جزییات زیاد واقعا در جهت و با اصول صحیح بوده باشن و در اون حدی که ظاهرشون در وهلهء اول به یک ذهن سطحی میرسونه امنیت رو بالا ببرن.

mtchabok
شنبه 26 آذر 1390, 11:57 صبح
من ترجیح میدم کپچای مستقل خودم رو داشته باشم.
البته نه اینکه لزوما خودم بنویسم، بلکه میگم پروژه باید تاحد امکان خودش کامل و مستقل باشه و به منابع خارجی و سرویسهای آنلاین و سایتهای دیگر وابستگی نداشته باشه.
منم موافقم ...
چونکه کدهای امنیتی عمومی بیشتر مورد توجه برای هک شدن هستن در ضمن در پروژه های شخصی میشه از روشهای خلاقانه ای هم استفاده کرد که مثلا مختص به فرهنگ یه کشور باشه و یا مختص به یه زبان و ... باشه . در صورتیکه در سرویسهای آنلاین عمومی مثل reCaptchaبه دلیل جهانی بدونش امکان محلی شدن نداره .