Система CAPTCHA

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

я проведення експериментів, програмісти з PWNtcha займаються винятково розпізнаванням існуючих популярних CAPTCHA. Результати опубліковані ними приголомшують (дивися таблицю 4).

Крім того працює цілий ряд online проектів по розпізнаванню CAPTCHA. Із програмами для розпізнавання можна ознайомиться на сайті

Найбільш ефективним методом розпізнавання образів на сьогоднішній день є використання нейронних мереж, що навчаються.

 

Таблиця 4.

Назва системиПриклад CAPTCHAРозпізнавання LiveJournal99%Paypal88%phpBB97%vBulletin100%linuxfr.org100%Authimage100%Clubic

100%lmt.lv

98%Slashdot89%

 

У самому загальному вигляді алгоритм розпізнавання складних CAPTCHA має наступний вигляд:

  1. Позбутися від шумів, що заважають розпізнаванню, на стільки, на скільки це можливо.
  2. Виділити кожний символ окремо.
  3. Привести його до нормального виду: повернути, відмаштабувати й перемістити в початок координат.
  4. Представити його для розпізнавання нейронній мережі.

 

Звичайно ж перед цим нейронна мережа повинна бути відповідним чином навчена, тобто настроєна саме для розпізнання конкретної CAPTCHA. У загальному випадку нейронна мережа повинна навчаться для кожної CAPTHCA окремо. Навчити розпізнавати всі CAPTHCA одну універсальну нейронну мережу неможливо.

Методи, що роблять важким розпізнавання

Згідно з неофіційним рейтингом систем CAPTCHA на сайті

  1. Застосування кольорових шумів на фоні, причому важливо, щоб хоча б одна складова шуму співпадали з кольором символів. Для людини виділити цільове зображення з шуму не є важкою задачею, а для машини це не що інше як розмиття контуру зображення.
  2. Застосування різноманітних шрифтів, які кардинально відрізняються один від одного. У такому випадку нейрону мережу треба буде тренувати розпізнавати усі символи усіх використаних шрифтів, що може значно ускладнити роботу зловмисника.
  3. Використання різноманітних кольорів шрифтів. Причому кольори підбираються таким чином, щоб символи у деяких місцях зливалися з фоном або шумами.
  4. Використання лінійних та нелінійних викривлень причому параметри цих викривлень завдавати випадково, щоб ускладнити процедуру повернення до нормального вигляду. Викривлення треба накладати на кожний символ окремо, а не на весь рядок одночасно.
  5. Не треба розміщувати символи на статичних знакомісцях. Навпаки треба розкидати символи
  6. Не треба використовувати у CAPTCHA словникових слів, бо розпізнавши вірно два чи три символи програма може по словнику підібрати все слово.

Програмний приклад реалізації CAPTCHA

Про CAPTCHA було сказано вже багато слів, тепер прийшов час навести приклад практичної реалізації тесту. Через те, що CAPTCHA найчастіше використовується у Internet для написання програми було обрано одну з найпопулярніших мов програмування для всесвітньої мережі PHP.

Файл class_captcha.inc.php

<?php

class ocr_captcha {

var $key; // Приватний статичний ключ

var $long; // Розмір тексту

var $lx; // Ширина зображення

var $ly; // Висота зображення

var $nb_noise; // Настройка шуму

var $filename; // Файл для зберігання на диск

var $imagetype="png";// Розширення зображення;

var $lang="en"; // Мова

var $public_key; // Публічний ключ

var $font_file="comic";// Шрифт

 

function ocr_captcha($long=6,$lx=120,$ly=30,$nb_noise=25) {

$this->key=md5("For generate private key");

$this->long=$long;

$this->lx=$lx;

$this->ly=$ly;

$this->nb_noise=$nb_noise;

$this->public_key=substr(md5(uniqid(rand(),true)),0,$this->long);

}

function get_filename($public="") {

if ($public=="")

$public=$this->public_key;

if (!is_dir("tmp")) // Чи вже існує

mkdir("tmp");

if (strpos($_SERVER[SystemRoot], ":\\")===false) // linux

$rad="tmp/"; // Document_root works nicely here

else // windows

$rad="tmp\\";

return $rad.$public.".".$this->imagetype;

}

function generate_private($public="") {

if ($public=="")

$public=$this->public_key;

return substr(md5($this->key.$public),16-$this->long/2,$this->long);

}

function check_captcha($public,$private) {

// when check, destroy picture on disk

if (file_exists($this->get_filename($public)))

unlink($this->get_filename($public));

return (strtolower($private)==strtolower($this->generate_private($public)));

}

function make_captcha($noise=true) {

$private_key = $this->generate_private();

$image = imagecreatetruecolor($this->lx,$this->ly);

$back=ImageColorAllocate($image,intval(rand(224,255)),intval(rand(224,255)),intval(rand(224,255)));

ImageFilledRectangle($image,0,0,$this->lx,$this->ly,$back);

if ($noise) { // rand characters in background with random position, angle, color

for ($i=0;$inb_noise;$i++) {

$size=intval(rand(6,14));

$angle=intval(rand(0,360));

$x=intval(rand(10,$this->lx-10));

$y=intval(rand(0,$this->ly-5));

$color=imagecolorallocate($image,intval(rand(160,224)),intval(rand(160,224)),intval(rand(160,224)));

$text=chr(intval(rand(45,250)));

ImageTTFText ($image,$size,$angle,$x,$y,$color,$this->font_file,$text);

}

}

else { // Випадковий колір

for ($i=0;$ilx;$i+=10) {

$color=imagecolorallocate($image,intval(rand(160,224)),intval(rand(160,224)),intval(rand(160,224)));

imageline($image,$i,0,$i,$this->ly,$color);

}

for ($i=0;$ily;$i+=10) {

$color=imagecolorallocate($image,intval(rand(160,224)),intval(rand(160,224)),intval(rand(160,224)));

imageline($image,0,$i,$this->lx,$i,$color);

}

}

// Приватний текст для читання

for ($i=0,$x=5; $ilong;$i++) {

$r=intval(rand(0,128));

$g=intval(rand(0,128));