Алгебраическая captcha
Наткнулся на просторах интернетов на любопытную реализацию технологии captcha — пользователю предлагается решить линейное уравнение с одним корнем и ввести решение в качестве проверочного кода.
Я, когда себе на блог искал капчу, много разных перепробовал, но с таким любопытным подходом не сталкивался. Решил посмотреть на неё поближе, открыл код страницы и разочаровался — задание для капчи выводится текстом, а не картинкой.
В общем из любопытства решил её поломать
В общем случае данная captcha представляет собой линейное алгебраическое уравнение (ax + b = 0). Для решения воспользовался . (Эх, почему же я не знал о ней на 1-3 курсах института?! Она даже на КПК способна работать!).
Строка с задчей для капчи получается из html-кода страницы примерно в таком виде:
<b>(<i>x</i>+9)∙5+4=64</b>.
От тегов <b> можно избавиться на этапе получения нужной строки, но большого вреда от них нет, так что для наглядности оставил.
Дальше строка немного обрабатывается для приведения к виду, пригодному для решения в Maxima, затем следует собственно решение и далее — обработка вывода для вычленений из него нужного проверочного кода (вывод у Maxima достаточно подробный, даже если применить опцию –quiet):
#!/usr/bin/perl use warnings; use strict; use encoding 'utf8'; my $input = '<b>(<i>x</i>+9)∙5+4=64</b>'; $input =~ s|</?[b,i]>||ig; $input =~ s/∙/*/ig; $input =~ s/−/-/ig; print $input,"\n"; my $out = qx/maxima --quiet --batch-string=solve"($input);"/; my $x = $1 if $out =~ m#\[x = (-?\s?\d+)\]#gi; print $x,"\n"; exit 0;
Вот так мне повезло за один вечер познакомиться с интересной идеей для механизма captcha и узнать о прекрасной системе компьютерной алгебры Maxima.
Желаю и вам побольше новых приятных открытий!

ноября 13, 2009 | Posted by dimio 
Categories:
Tags:
Последние комментарии