Алгебраїчна captcha
Натрапив на просторах інтернетів на цікаву реалізацію технології captcha - користувачеві пропонується вирішити лінійне рівняння з одним коренем і ввести рішення в якості перевірочного коду.
Я, коли собі на блог шукав капчу, багато різних перепробував, але з таким цікавим підходом не стикався. Вирішив подивитися на неї ближче, відкрив код сторінки і розчарувався - завдання для капчі виводиться текстом, а не картинкою.
Загалом з цікавості вирішив її поламати ![]()
У загальному випадку дана captcha являє собою лінійне алгебраїчне рівняння (ax + b = 0). Для вирішення скористався . (Ех, чому ж я не знав про неї на 1-3 курсах інституту?! Вона навіть на КПК здатна працювати!).
Рядок із задчей для капчі виходить з html-код сторінки приблизно в такому вигляді:
1 | <b> (<i> x </ i> +9) ∙ 5 +4 = 64 </ b> |
.
Від тегів
1 | <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.
Бажаю і вам побільше нових приємних відкриттів!
Ще на схожі теми:
Рубрики: Linux , Гаджети , Технократія |
Мітки: captcha , linux , maxima , security , алгебра , програмінг |
Коментарів немає 


Останні коментарі