Рефераты. Система CAPTCHA

<?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;$i<$this->nb_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;$i<$this->lx;$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;$i<$this->ly;$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; $i<$this->long;$i++) {

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

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

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

$color = ImageColorAllocate($image, $r,$g,$b);

$shadow= ImageColorAllocate($image, $r+128, $g+128, $b+128);

$size=intval(rand(12,17));

$angle=intval(rand(-30,30));

$text=strtoupper(substr($private_key,$i,1));

ImageTTFText($image,$size,$angle,$x+2,26,$shadow,$this->font_file,$text);

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

$x+=$size+2;

}

if ($this->imagetype=="jpg")

imagejpeg($image, $this->get_filename(), 100);

else

imagepng($image, $this->get_filename());

ImageDestroy($image);

}

function display_captcha($noise=true) {

$this->make_captcha($noise);

$res="<input type=hidden name='public_key' value='".$this->public_key."'>\n";

$alt=($this->lang=="en")?("Image"):("Зображення");

$res.="<img src='".$this->get_filename()."' alt='$alt' border='0'>\n";

return $res;

}

}

?>

function display_captcha($noise=true) {

$this->make_captcha($noise);

$res="<input type=hidden name='public_key' value='".$this->public_key."'>\n";

$alt=($this->lang=="fr")?("Vous devez recopier dans le champ ci-dessous les ".$this->long." caractиres parmis 0 а 9 et A а F"):("Vous must read and type the ".$this->long." chars within 0..9 and A..F");

$res.="<img src='".$this->get_filename()."' alt='$alt' border='0'>\n";

return $res;

}

}

?>


Файл test.php

<html>

<head>

<title>Тест captcha - перевiрка людина/бот</title>

</head>

<body>

<h2>Введiть текст, що зображено на рисунку:</h2><br />

<?

require_once("./class_captcha.inc.php");

// Отримати параметри

if (isset($HTTP_POST_VARS['public_key']))

$public=$HTTP_POST_VARS['public_key'];

if (isset($HTTP_POST_VARS['private_key']))

$private=$HTTP_POST_VARS['private_key'];

$p=new ocr_captcha();

if (isset($HTTP_POST_VARS['private_key'])) {

if ($p->check_captcha($public,$private))

echo "<center><font color=\"green\">Ви пройшли перевiрку</font></center>";

else

echo "<center><font color=\"red\">Ви не пройшли перевiрку</font></center>";

}

echo "<form name=\"form1\" action=\"example.php\" method=\"POST\">\n";

echo $p->display_captcha(true);

echo "<br>\n";

echo "<input type=\"text\" name=\"private_key\" value=\"\" maxlength=\"6\" size=\"6\"><br>\n";

$private=$p->generate_private();

echo "<input type=\"submit\" value=\"Перевiрити\">";

?>

</body>

</html>

Аналіз наведеного прикладу

У результаті роботи наведеного коду ми маємо систему CAPTCHA, що зображено на рисунках 9, 10 та 11.

Рис 9. Загальний вигляд системи CAPTCHA

Рис 10. Якщо перевірка пройшла вдало

Рис. 11. Якщо перевірка пройшла невдало

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

Іноді легкість розпізнавання для користувача має більший вплив на розробника програмного забезпечення ніж питання надійності - саме тому і з’являються CAPTCHA, які може зламати навіть малодосвідчений програміст.

У наведеній реалізації CAPTCHA гарним рішеннями було:

-         різнокольоровий фон;

-         різнокольоровий шрифт;

-         відсутність чітких знакомісць;

-         місцями символи можуть перекриватися;

-         було застосовано перевороти для кожного символу окремо.


Недоліки наведеної реалізації CAPTCHA:

-         один шрифт;

-         відсутність маштабування символів;

-         перекриття символів зустрічаються рідко.


Таким чином отримали дружню до користувача систему CAPTCHA з середнім рівнем захисту від ботів.

Висновки

CAPTCHA – це дуже корисна та прогресивна технологія захисту від ботів. Але й досі не створено і мабуть не буде створено на 100 відсотків надійної CAPTCHA. Зламати будь яку існуючу систему це лише питання часу та грошей, і це ще раз підтверджує твердження “все, що збудовано людиною може бути нею і зламане”.

Хоча вже сьогодні чуються нові віяння у розробці CAPTCHA. На спеціалізованих сайтах вже можна побачити тестові трьохвимірні CAPTCHA. Але не треба бути пророком, щоб сказати – як тільки вони стануть широко використовуватися, то знайдуться й ті які навчаться їх обходити.

Також можна зробити припущення, що основним ворогом CAPTCHA у найближчому майбутньому стане не хакерське мистецтво, а нейроні мережі та розробки у галузі штучного інтелекту.

Використані джерела

1.     #"#">#"#">http://ocr-research.org.ua

4.     Генетические алгоритмы, искусственные нейронные сети и проблемы виртуальной реальности / Г. К. Вороновский, К. В. Махотило. – Х.: ОСНОВА,1997 – 112 с



Страницы: 1, 2, 3



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.