Система CAPTCHA
Информация - Компьютеры, программирование
Другие материалы по предмету Компьютеры, программирование
я проведення експериментів, програмісти з PWNtcha займаються винятково розпізнаванням існуючих популярних CAPTCHA. Результати опубліковані ними приголомшують (дивися таблицю 4).
Крім того працює цілий ряд online проектів по розпізнаванню CAPTCHA. Із програмами для розпізнавання можна ознайомиться на сайті
Найбільш ефективним методом розпізнавання образів на сьогоднішній день є використання нейронних мереж, що навчаються.
Таблиця 4.
Назва системиПриклад CAPTCHAРозпізнавання LiveJournal99%Paypal88%phpBB97%vBulletin100%linuxfr.org100%Authimage100%Clubic
100%lmt.lv
98%Slashdot89%
У самому загальному вигляді алгоритм розпізнавання складних CAPTCHA має наступний вигляд:
- Позбутися від шумів, що заважають розпізнаванню, на стільки, на скільки це можливо.
- Виділити кожний символ окремо.
- Привести його до нормального виду: повернути, відмаштабувати й перемістити в початок координат.
- Представити його для розпізнавання нейронній мережі.
Звичайно ж перед цим нейронна мережа повинна бути відповідним чином навчена, тобто настроєна саме для розпізнання конкретної CAPTCHA. У загальному випадку нейронна мережа повинна навчаться для кожної CAPTHCA окремо. Навчити розпізнавати всі CAPTHCA одну універсальну нейронну мережу неможливо.
Методи, що роблять важким розпізнавання
Згідно з неофіційним рейтингом систем 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));