C, PHP, VB, .NET

Дневникът на Филип Петров


* Captcha

Публикувано на 07 декември 2008 в раздел ОСУП.

Captcha е името на широко използвана техника за защита на форми. Тя е съкращение от "Completely Automated Public Turing test to tell Computers and Humans Apart", което преведено означава “напълно автоматизирана проверка за разграничаване на човек от компютър”. Процеса на проверка изисква един компютър (сървър) да поиска отговора на прост въпрос, но по начин, който предотвратява възможноста за автоматизирано намиране на отговора от компютър. По този начин всеки потребител въвел правилен отговор бива упълномощен с права за достъп и ние сме сигурни, че той е човек, а не машина (bot). Тази техника премахва следните проблеми в сигурноста на системата:

    - Защитава форми, които попълват информация в база от данни от автоматични скриптове, които запълват базата от данни с невалидни данни.
    - Не позволява на компютър да изпробва произволни комбинации от имена и пароли и по този начин защитава потребителските акаунти.

Изпълнението на модула за защита преминава през няколко етапа:

а) Генериране на произволен код, обикновено съставен от букви и цифри;

б) Записване на генерирания код в потребителската сесия;

в) Използвайки модул за генериране на графични изображения (например в PHP това е GD2) се създава картинка, на която се изобразява генерирания код. Обикновено се добавя "шум" (distortion), чрез който затрудняваме автоматизираното разпознаване на кода от машина. Обикновено е добре да се изобразяват букви с различни шрифтове, като самите те се завъртат под произволен (в дадени граници) ъгъл. Размерите на самата картинка и големината на буквите също могат да варират в даден интервал. Крайната цел е да се затруднят компютърните алгоритми за разпознаване на изображения, но до такава степен, че да не затрудняват истинския потребител прекалено много;

г) Картинката се отпечатва на екрана на потребителя до формата, която ще бъде попълвана. В самата форма се слага допълнително текстово поле, в което потребителя трябва да въведе кода от картинката за валидация;

д) Кода от формата, заедно с останалите данни, се изпращат чрез метода POST и системата сравнява стойноста на кода въведен във формата с този, записан в потребителската сесия. Ако двете стойности съвпадат, то приемаме, че заявката е попълнена от човек, а не машина.

Въвеждането на CAPTCHA е първата важна стъпка за предпазване на формите от brute force атаки. Ето няколко лоши практики, които не трябва да се използват:

- Използване на предварително зададени комбинации от кодове. Учудващо е, че все още се срещат форми, които са "защитени" чрез предварително генерирана серия от картинки и записана комбинация от техните кодове. Това действително пести системни ресурси (генерирането на изображение е тежка операция), но в никакъв случай не може да бъде разглеждано дори като значима защита. Атакуващият може да си изгради собствена база от данни, в която да записва името на подадена картинка със съответващия ѝ код - до пълно изчерпване;

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

- Използването на двусмислени символи ще обърка потребителите. Избягвайте да използвате буквата "O", защото тя може да бъде объркана с "0". Същото важи за "l", "I" и "1".

Ето едно изображение, на което са демонстрирани различни Captcha варианти:

Варианти на Captcha
Варианти на Captcha

Друг често използван подход е да се зададе проста задача на потребителя - например "колко е две плюс три" или "напишете фамилното име на Петър Иванов". За съжаление тук ще се нуждаем от значително количество въпроси в базата от данни, а това ще е трудна задача (те трябва да са прости, защото едва ли можем да очакваме всеки потребител да може да решава интеграли). Съществуват и редица изключително интересни варианти, като например puzz captcha.

При Captcha основният проблем е фактът, че колкото по-добра е защитата, толкова по-трудно е за крайният потребител.

 



Добави коментар

Адресът на електронната поща няма да се публикува


*