True или False? Вот в чем вопрос.. © A. Fatred
Я сейчас работаю над страницей регистрации одного сайта. Несколько часов думал, как реализовать код безопасности аля защита от ботов.
Вот до чего додумался.
Какой смысл генерить каждый раз новый код? Можно вообще использовать только одну картинку типа "1+9=" введите результат. Бот все равно пробиться не сможет.
А можно сделать десять картинок заранее и пустить их на произвольное отображение.
Если выбрана (показана) картинка номер 1 - переменной code присваевается значение, указанное на картинке, например - 16. Если картинка 7 - значение 79. И так далее.
После чего введенный пользователем код сравнивается со значением переменной code и если совпадает - велком!
Я так и сделал, но хотелось бы как можно реже ошибаться.
Потому у меня несколько вопросов:
1. Чем мой вариант не подходит?
2. Нарушена ли безопасность?
3. Как поступают профессионалы?
Вот до чего додумался.
Какой смысл генерить каждый раз новый код? Можно вообще использовать только одну картинку типа "1+9=" введите результат. Бот все равно пробиться не сможет.
А можно сделать десять картинок заранее и пустить их на произвольное отображение.
Если выбрана (показана) картинка номер 1 - переменной code присваевается значение, указанное на картинке, например - 16. Если картинка 7 - значение 79. И так далее.
После чего введенный пользователем код сравнивается со значением переменной code и если совпадает - велком!
Я так и сделал, но хотелось бы как можно реже ошибаться.
Потому у меня несколько вопросов:
1. Чем мой вариант не подходит?
2. Нарушена ли безопасность?
3. Как поступают профессионалы?
1 раз вручную настраивается бот и защита перестает работать. ИМХО, название картинки и адрес и значение проверочной переменной не должны иметь прямого соответствия. Именно поэтому код генерирующийся по какому-либо алгоритму обойти можно только зная алгоритм, а в вашем случае система обходиться сопоставлением.
Это были условные обозначения. Имя переменной, код и название картинки.
Для ясности.)
Ясно. =) В общем на самом деле, не так важно что на картинке, важно то, чтобы вычисление прямой закономерности между кодом и результатом было практически невозможным. =) Ну, это не считая распознавания картинки и прочих интеллектуальных наворотов у ботов.
Если боты реально научатся понимать изображения - алгоритмы уже не спасут=)
То есть мой вариант использовать можно? Главное спрятать поглубже переменную, хранящую истинный код?
Да, вполне можно. =) Еще один совет - можно использовать не только картинки вида "1+1=", но и например "три - 1 это".
Благодарю.=)
О! Спасибо. Кто бы мне еще объяснил, каким образом боты умудряются понимать нарисованное..
Если ради безопасности приходится прибегать даже к анимации.
Система распознавания символов.. каких? Графических?
В любом случае сайт, над которым я сейчас работаю, далеко не контакт Дурова.
Так что вряд ли к нам заглянут столь серьезные гости.=)
Нет?
Система распознавания символов.. каких? Графических?
ru.wikipedia.org/wiki/OCR
Так что вряд ли к нам заглянут столь серьезные гости
Если будет выгодно у вас спамить - придут. =)
Проект рассчитан на 250 пользователей. Особой выгоды для спама не вижу.
Но все же постараюсь повысить защиту. На всякий случай.=)
Спасибо за ссылку.
Что касается картинок "2+2=", то они не помогут, если бот "умеет читать" -простую арифметику он точно знает, а вот некоторые пользователи, как показывает практика -нет :о)
Или генерить вместо цифр - random string, и сохранять вместо ответа
з.ы если параноя, то можно помимо текста нарисовать туда пару линий, чтобы было тяжелее распознавать (не то чтобы оно сильно помогло
$text=getenv('QUERY_STRING');
$text=sqrt(base_convert($text,12,10)/3);
if (strlen($text)!=5) exit();
$im=imagecreate(90,40);
$white=imagecolorallocate($im,255,255,255);
imageColorTransparent($im,$white);
imagefill($im,0,0,$white);
$size=24;
$color=imagecolorallocate($im,mt_rand(0,155),mt_rand(0,155),mt_rand(0,155));
imageTTFText($im,$size,0,10,30,$color,$_SERVER['DOCUMENT_ROOT'].'/themes/font.ttf',$text);
Header("Content-type: image/png");
ImagePng($im);
ImageDestroy($im);
?>
Мой вариант... любой шрифт на любой картинке...
$text=getenv('QUERY_STRING');
$text=sqrt(base_convert($text,12,10)/3);
if (strlen($text)!=5) exit();
$im=imagecreate(90,40);
$white=imagecolorallocate($im,255,255,255);
imageColorTransparent($im,$white);
imagefill($im,0,0,$white);
$size=24;
$color=imagecolorallocate($im,mt_rand(0,155),mt_rand(0,155),mt_rand(0,155));
imageTTFText($im,$size,0,10,30,$color,$_SERVER['DOCUMENT_ROOT'].'/themes/font.ttf',$text);
Header("Content-type: image/png");
ImagePng($im);
ImageDestroy($im);
?>
Мой вариант... любой шрифт на любой картинке...
гаф!
пасиб за наглядный пример.
может тогда уже с случайными stringами (вкл числа), чтобы интереснее
Надеюсь куда кидать картинку и шрифт догадаетесь. )
Для того чтобы обойти твою защиту достаточно одного посещения сайта человеком для настройки бота. Вот банальнейший скрипт который регистрирует пользователя в обход твоей системы. Если его поставить в цикл... Вобщем сам понимаешь - ничего хорошего.
$url = "www.stroigid.com";
$lol = fsockopen($url, 80, $errno, $errstr, 30);
$post = "next=1";
$len = strlen($post);
$out = "POST /new_contractor.php HTTP/1.1 \r\n";
$out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1
$out .= "Referer: www.stroigid.com/new_contractor.php\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Host: $url\r\n";
$out .= "Content-Length: $len\r\n\r\n";
$out .= "$post\r\n";
fputs($lol, $out);
$сoоkiе = "";
while (!feof($lol)) {
$line = fgets($lol, 128);
if ($line == "\n")
break;
if (!(strpos($line, "Set-coоkie:") === false)) {
$сoоkiе .= trim(substr($line, strlen("Set-coоkie:"), strpos($line, ";") - strlen
("Set-coоkie:") + 1));
}
}
$сoоkiе = str_replace("\n", "", $сoоkiе);
fclose($lol);
$lol = fsockopen($url, 80, $errno, $errstr, 30);
$post = 'contractor[company]=Test&contractor[name]=Test&contractor[adress]=&contractor[phone_code]=017&contractor[phone]=7777777&contractor[secred_code]=183530410&contractor[code]=15566&next=1';
$len = strlen($post);
$out = "POST /new_contractor.php HTTP/1.1 \r\n";
$out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1
$out .= "Referer: www.stroigid.com/new_contractor.php\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Host: $url\r\n";
$out .= "сoоkiе: $сoоkiе\r\n";
$out .= "Content-Length: $len\r\n\r\n";
$out .= "$post\r\n";
fputs($lol, $out);
while (!feof($lol))
echo fgets($lol, 128);
fclose($lol);
?>
Текущие версии работают через сессии. Модернизировать можете сами, тут главный принцип вывода.
P.S. Круто, их нынешний програмист даже не додумался изменить код, хотя я указывал на это место. XDDDD
я так понял главная претензия к
$text=getenv('QUERY_STRING');
$text=sqrt(base_convert($text,12,10)/3);
:P? так это никто и не будет пользовать
input type="hidden" name="contractor[secred_code]" value=
понятненько, т.е мона просто сабмитить value и соотв. код c картинки.
мдя. не заметил, скроля код, который ты запостил (точнее было влом скролить).
cпасибо.
з.ы а session эт через печеньки?
сессии
сессии
sps