Warning: Use of undefined constant _FILE_ - assumed '_FILE_' (this will throw an Error in a future version of PHP) in /home/bolyarco/www-ikratko/ogrelab/wp-content/plugins/ad-blocker-stats-vip/ad-blocker-stats-vip.php on line 13

Warning: count(): Parameter must be an array or an object that implements Countable in /home/bolyarco/www-ikratko/ogrelab/wp-content/plugins/microkids-related-posts/microkids-related-posts.php on line 645

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

Posted / Публикувана 2008-07-11 in category / в категория: Tangra framework for PHP, Web development

Warning: count(): Parameter must be an array or an object that implements Countable in /home/bolyarco/www-ikratko/ogrelab/wp-content/plugins/microkids-related-posts/microkids-related-posts.php on line 645

В последните дни за занимавах да направя 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 да са прости семантични задачки, а не графични изображения.

Tags: , ,

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

  1. Zipp Says:

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

  2. бай Асан Says:

    Чак сега осъзнавам колко е голям проблема. Аз не пиша за Интернет и не ми трбват такива модули, но много ме дразният тези букви и цифри, дето всеки път трбва да ги пиша.