سامانه گلستان، یک سیستم اتوماسیون دانشگاهی است که توسط اکثر دانشگاه های دولتی ایران استفاده میشود. با توجه به اینکه این سامانه هیچ api ای در اختیار دانشجویان نمیگذارد، برای انجام خودکار بعضی از کار ها از جمله استخراج لیست دروس ارائه شده، نیازمند استفاده از scraper هستیم که برای آن باید ابتدا باید راهی برای کپچای آن پیدا کنیم.

با توجه به پیشرفت سرعت پردازش در چند سال اخیر دیگر حل مسائلی مانند تشخیص نویسه1 کار سختی نیست و میتوان به جای استفاده از راه حل های آماده مانند Tesseract، با استفاده از روش هایی مانند شبکه عصبی مصنوعی کانولوشنال2، این مسائل را حل کرد
۱. مقدمه
کپچا (به انگلیسی: CAPTCHA)، مخفف Completely Automated Public Turing test to tell Computers and Humans Apart یک سامانهٔ امنیتی و روند ارزیابی است که برای جلوگیری از برخی حملههای خرابکارانه رباتهای اینترنتی بهکار میرود.
۱.۱. انواع کپچا
۱.۱.۱. کپچا متنی
متداول ترین آن ها تصویری از حروف و اعداد به هم ریخته است که داری نویس هایی در پس زمینه خود هستند مانند شکل زیر:

۱.۱.۲. کپچا صوتی
کپچاهای صوتی که شامل صدای یک سری حروف و اعداد بطور واضح می باشند اما برای خلاصی از اپلیکیشن های تشخیص صدا ممکن است صداهایی را در پشت زمینه ایجاد کند. این نوع از کپچا معمولا به عنوان جایگزین برای روش های دیگر کپچا در سایت ها وجود دارد تا افراد دارای محدودیت های دیداری با مشکل مواجه نشوند.
۱.۱.۳. پروژه reCAPTCHA
این پروژه که در ابتدا در دانشگاه کارنگی ملون ساخته شده و بعد ها توسط گوگل ادامه یافته، سعی میکند در کنار کپچا، به جمع آوری داده هایی از جمله برچسب زدن عکس یا کمک به دیجیتالی کردن متون چاپی بپردازد.

۱.۱.۴. پروژه noCAPTCHA
این پروژه که ادامه همان reCAPTCHA است با استفاده آنالیز نحوه تعامل کاربر با سایت و تاریخچه استفاده از noCAPTCHA ، ارزیابی را انجام میدهد و تنها در مواقعی که احتمال بالای ربات بودن وجود داشته باشد به کاربر چالش3 نشان میدهد.

۱.۲. موارد استفاده از کپچا
۱.۲.۱. جلوگیری از نظرات اسپم در سایت و وبلاگ
اکثر صاحبان وبلاگ یا سایت ها با نرم افزارهای اتوماتیک آنلاین که اقدام به انتشار نظرات اسپم میکنند آشنایی دارند که معمولا به هدف افزایش رنک و بهبود سئو سایت اسپمر بکار میرود. با استفاده از کپچا تنها انسان ها قادر به انتشار نظر در بخش وبلاگ سایت شما خواهند بود و به این ترتیب نیاز به عضویت در سایت یا وبلاگ شما برای جلوگیری از نظرات اسپم نیست.
۱.۲.۲. جلوگیری از ساخت خودکار کاربر
سایت های زیادی در دنیا خدمات رایگان ارائه میدهند که نیازمند عضویت و ساخت اکانت از طرف افراد هستند. مهمترین آنها سیستم های ایمیل یاهو و گوگل هستند. تا چند سال پیش و قبل از بکارگیری کپچا بزرگترین مشکل آنها ساخت تعداد زیادی اکانت توسط روبات های اینترنتی بود که میتوانستند در چند دقیقه صدها ایمیل بسازند. استفاده از سیستم کپچا این امکان را فراهم کرد که تنها انسان ها قادر به تکمیل فرم و ثبت نام نهایی باشند و امروزه به یک ضرورت در سیستم های رایگان تبدیل شده است.
۱.۲.۳. جلوگیری از حمله لغت نامه ای برای به دست آوردن پسورد
در گذشته و قبل از همه گیر شدن سیستم کپچا، یکی از روش های رایج برای هک کردن اکانت کاربران و دسترسی به اطلاعات ، آزمون و خطای کلمات عبور مختلف بوده است. در این روش هزاران کلمه از روی فرهنگ لغات برای یک نام کاربری مشخص امتحان میشد. امروزه با چند تلاش اشتباه در سیستم های ایمیل مانند یاهو یک کپچا به کاربر نشان داده میشود تا از این روش هک بخوبی جلوگیری شود.
۱.۳. نیاز به کپچا
۱.۳.۱. همیشه کپچا لازم نیست
کپچا ها برای جلوگیری از استفاده گسترده bot ها بیشترین تاثیر را دارند، پس بهتر است به جای اینکه برای هر دفعه لاگین ورود کپچا الزامی باشد، در صورت اشتباه وارد کردن پسورد کپچا نمایش داده شود.
۱.۳.۲. کپچا برای api ها
با گسترش استفاده از api ها نیاز به راه حلی برای جلوگیری از سوء استفاده ی bot ها حس میشود، شرکت هایی مانند kasada [1] با اراعه سرویس های WAF4 سعی بر حل این مشکل را دارند. یکی از روش های مورد استفاده این شرکت تحلیل نحوه ارسال درخواست5 های کلاینت هاست، همچنین این شرکت با ارسال چالش های کریپتوگرافی سعی در کند کردن و افزایش هزینه ی bot ها دارد.
۲. کارهای مرتبط
در بخش مقدمه انواع کپچا ها معرفی شد که همه ی نوع کپچا ها را در بر نمیگرفت اما پر استفاده ترین انها را مد نظر قرار داده بودیم در این بخش قصد داریم به کار هایی که گروه های مختلف در زمینه شکستن کپچاهای صوتی و ریکپچا ها با استفاده از هوش مصنوعی انجام داده اند بپردازیم و روند کلی حل مسئله درک کنیم.
حل به وسیله GAN6 : یک در این روش که به صورت unsupervised میباشد، تلاش میشود تا با دو شبکه عصبی یک حلقه تشکیل داد، یکی از شبکه ها که refiner نام دارد سعی میکند خروجی یک الگوریتم نه چندان هوشمند را به خروجی نمونه نزدیک کند و شبکه دیگر که discriminator نام دارد سعی میکند خروجی نمونه را به خروجی الگوریتم نزدیک کند[2]
حل به وسیله یادگیری ماشین: در این روش به دلیل supervised بودن نیاز به دیتاست بزرگی داریم، با استفاده از مدل هایی مانند CNN میتوان با دقت خوبی متن کپچا را به دست آورد[3]
حل به وسیله یادگیری عمیق فعال7 : این روش نیاز به دیتاست کوچک تری نسبت به روش قبلی دارد[4]
۳. روش پیشنهادی
در سامانه های متن باز8، میتوان با تغییر کد منبع9، داده مورد نیاز برای یادگیری ماشینی را به دست آورد. با توجه به اینکه به الگوریتم تولید کپچای سامانه گلستان دسترسی نداریم مجبوریم از دیگر مجموعه داده های موجود مانند EMNIST استفاده کنیم.
برای بررسی دقت، راهی بجز برچسب زدن داده های اصلی وجود ندارد پس برای این کار، حدود ۱۰۰۰ کپچا جمع آوری میکنیم و با استفاده از پلتفرم LabelBox به برچسب زنی دستی میپردازیم. البته این کار ممکن است باعث ایجاد تبعیض10 شود زیرا بعضی از کپچا ها توسط انسان هم قابل تشخیص نیستند و از مجموعه داده محک11 حذف میشوند.
۴. آزمایش ها
برای شکستن یک کپچا چند گام اساسی داریم، پیاده سازی این گام ها در repository این پروژه به این آدرس آمده است.
۴.۱. از بین بردن نویز تصویر
برای از بین بردن نویز از GaussianBlur استفاده میکنیم، نتیجه به دست آمده در پایین قابل مشاهده است.


حال میتوان به باینری کردن عکس بپردازیم.
۴.۲. حذف ماسک مربوط به شرکت سازنده
با استفاده از میانگین گرفتن حدود ۲۰۰۰ کپچای grayscale شده، یک فایل mask ایجاد میکنیم، از باینری شده ی این تصویر میتوان برای حذف ماسک زیر عکس استفاده کرد


۴.۳. حذف خطوط روی تصویر
برای حذف خطوط از Morphological Transformation ها استفاده میکنیم. با توجه به کاربرد مورد نظر ما Opening گزینه مناسب است،همچنین خطوط با اندازه ۱ پیکسل کشیده شده اند پس از یک Kernel با سایز 2x2 استفاده میکنیم.


۴.۴. شناسایی کاراکتر های موجود در تصویر
با توجه به اینکه کاراکتر های به هم چسبیده در کپچا نداریم و میدانیم هر کپچا حتما ۵ کاراکتر دارد، از روش خوشه بندی k-mean برای جداسازی کاراکتر ها استفاده میکنیم.

۴.۵. آزمایش اولیه با دیتاست MNIST
به دلیل اینکه آزمایش دیتاست EMNIST وقت گیر بوده و ممکن است به نتیجه نرسیم ابتدا به صورت آزمایشی با دیتاست MNIST تست میکنیم، در صورت موفق بودن ادامه میدهیم، برای اینکار باید فقط بر روی کاراکتر های عددی تست را انجام دهیم.
دقت این مدل برای خود دیتاست MNIST حدود 99.25 درصد است.
Successful predictions: 386
All predictions: 739
Success Rate: 0.5223274695534507
با توجه به اینکه این بهترین نتیجه قابل دستیابی نیست و هنوز قابلیت tune کردن مدل را داریم، تست موفق اعلام میکنیم و راه حل را ادامه میدهیم
۴.۶. آزمایش نهایی
حال برای آزمایش نهایی یک مدل CNN را توسط EMNIST لرن میکنیم و از آن استفاده میکنیم.
per Char Successful predictions: 3202
per Char predictions: 4950
per Char Success Rate: 0.6468686868686868
Successful predictions: 129
All predictions: 990
Success Rate: 0.1303030303030303
همانطور که مشاهده میشود، درصد موفقیت برای حدس درست کل کپچا بسیار پایین است. برای بهبود نتایج دو راه وجود دارد
عوض کردن تابع crop، تا نتایج کراپ کردن دقیق تر بشود(میتوان به جای k-mean از contour استفاده کرد)
لیبل زدن تعداد بیشتری داده تا بتوان از خود داده های اصلی برای لرن کردن استفاده کرد
ایده قبلی + pre-train کردن مدل با دیتاست EMNIST
۵. منابع
[1] https://www.kasada.io
[2] https://github.com/rickyhan/SimGAN-Captcha
[3] https://medium.com/@ageitgey/how-to-break-a-captcha-system-in-15-minutes-with-machine-learning-dbebb035a710
[4] Stark, Fabian, Caner Hazırbaş, Rudolph Triebel and Daniel Cremers. “CAPTCHA Recognition with Active Deep Learning.” (2015).
OCR(Optical character recognition)
CNN(Convolutional neural network)
Challenge
Web Application Firewall
request
Generative adversarial network
Active Deep Learning
OpenSource
Source Code
Bias
Train dataset