Да напишеш насила captcha модул

В последните дни за занимавах да направя user registration модул за моя Tangra Framework for PHP. Както и се очакваше - грандоманията в мен отново надделя и вместо на спретна набързо едно модулче с проста формичка за user details, аз се отплеснах и направих чудовищна форма с всички възможни полета за които се сетих, че е конфигурируема отгоре на това (т.е. може да се избере като се настройва сайта кои полета да се показват и кои да са задължителни).

Както и да е, направих регистрацията, админа и т.н. но в един момент покрай правенето на страница за “Resend activation email” е усетих, че злонамерени келеши могат да я използват за много успешна DOS атака. Налагаше се да сложа captcha.

Разрових се из интерсвинщината, свалих сигурно 7-8 различни PHP captcha генератори, но нито един от тях не беше подходящ за вграждане в модул - едни бяха специално пригодени за определени приложения (като Wordpress например) и изискваха доста преработка, други бяха страшно мърляво написани, трети бяха прекалено обемисти и т.н.

Накрая се спрях за основа на http://www.white-hat-web-design.co.uk/articles/php-captcha.php - кратък код, малко калпав, ама лесно се оправяше.

Основният ми проблем с писането на captcha модул беше, че точно с такава лигавщина, точно сега, ВЪОБЩЕ не ми се занимаваше. Покрай модула за user registration се наложи да направя и няколко спомагателни модула като db_table_countries  и db_table_usstates и те, общо взето, ми изсмукаха батериите, които използвам за писане на модули :-). В крайна сметка с голямо нежелание се захванах и в резултат сега има три нови модула:

  • captcha - предоставя базовата функционалност - генериране на код, показване на изображение;
  • form_field_captcha - поле за формите, наследява Form_Field. За щастие се оказа, че стана много лесно.
  • form_field_captcha_html_tpl_metallic - HTML template-и за form_field_captcha за metallic темата.

Captcha-та в крайна сметка има няколко допълнителни екстри в сравнение с оригиналния код, който използвах:

  • генерират се случайни цветове за буквите, фона и шума;
  • шума е с два цвята - един като на буквите, другия близък до него - доколкото съм чел за методите за анализ на изображения - това затруднявало разработката на алгоритъм за разпознаване. Поне ламерите ще стоят настрани;
  • надписът се върти на случайно генериран градус;
  • шрифта, размера, броя символи се четат от конфигурационен файл.

Мислех дали да не направя всеки символ да си се върти поотделно, но реших, че е прекалено. Ако някой успее да напише програмка за разпознаване в сегашния вид - халал да му е DOS-a :-).

Всъщност, ако човек се замисли реално, какъвто и captcha да сложиш, ако потенциалната печалба от пробиването му е достатъчно висока - все ще се намери някой да я свърши тази работа. Хората вече правят софтуер за разпознаване на човешки лица. Най-вероятно до една-две години ще се наложи всички captcha да са прости семантични задачки, а не графични изображения.


One Response to “Да напишеш насила captcha модул”

  1. Zipp Says:

    Блин что за народ… Каждый себе капчу пишет… Я даже с загадками видел))

Leave a Reply

This is a captcha-picture. It is used to prevent mass-access by robots. (see: www.captcha.net)

You must read and type the 5 chars within 0..9 and A..F, and submit the form.

  

Oh no, I cannot read this. Please, generate a