|
|
| Модератор форума: chocopie, Samuel, Mihail |
| Форум » uCoz » Помощь по uCoz » Код безопасности |
| Код безопасности |
off-line Добавлено: 2012-Авг-12 - 18:28 | Сообщение #1
Как сделать так чтоб код безопасности показывал не буквы а токо цифры?
Добавлено (12.08.2012, 18:28:27) Мой скайп near.rivler |
off-line Добавлено: 2012-Авг-12 - 18:36 | Сообщение #2
Зайди в Редактор страниц-Общие настройки- ищешь там "Тип кода безопасности капчи" и ставишь на простой!
[url=http://gamersfan.ru]Игровой портал[/url] |
off-line Добавлено: 2012-Авг-12 - 22:14 | Сообщение #3
ставил на простой, не работал
Что же такое твориться? |
off-line Добавлено: 2012-Авг-14 - 11:44 | Сообщение #4
Часто так сделать невозможно (отключена или недоступна GDLib, просто не хочется стрелять из пушки по воробьям и т.п.) Тогда можно сделать гораздо проще, написав скрипт, самостоятельно кодирующий GIF'ки капчи прямо в теле скрипта с помощью base64.
Для простоты ограничимся капчами, состоящими только из цифр и напишем следующий демо-скрипт: Code <?php //Совсем простая капча $captha_length=4; // Количество символов в коде $captcha_random_seed="543129"; // Случайное число для защиты; поставьте своё if (isset($_REQUEST['image'])) { function write_image_number ($num) { $number="R0lGODlhCgAMAIABAFNTU////yH5BAEAAAEALAAAAAAKAAwAAAI"; // Заголовок GIFки в base64 if ($num=="0") { $len="63"; $number.="WjIFgi6e+QpMP0jin1bfv2nFaBlJaAQA7";} if ($num=="1") { $len="61"; $number.="UjA1wG8noXlJsUnlrXhE/+DXb0RUAOw==";} if ($num=="2") { $len="64"; $number.="XjIFgi6e+QpMPRlbjvFtnfFnchyVJUAAAOw==";} if ($num=="3") { $len="64"; $number.="XjIFgi6e+Qovs0RkTzXbj+3yTJnUlVgAAOw==";} if ($num=="4") { $len="64"; $number.="XjA9wG8mWFIty0amczbVJDVHg9oSlZxQAOw==";} if ($num=="5") { $len="63"; $number.="WTIAJdsuPHovSKGoprhs67mzaJypMAQA7";} if ($num=="6") { $len="63"; $number.="WjIFoB6vxmFw0pfpihI3jOW1at3FRAQA7";} if ($num=="7") { $len="61"; $number.="UDI4Xy6vtAIzTyPpg1ndu9oEdNxUAOw==";} if ($num=="8") { $len="63"; $number.="WjIFgi6e+QpMP2slSpJbn7mFeWDlYAQA7";} if ($num=="9") { $len="64"; $number.="XjIFgi6e+QpMP0jinvbT2FGGPxmlkohUAOw==";} header("Content-type: image/gif"); header("Content-length: $len"); echo base64_decode($number); } // Вывод закодированных изображений на экран if (array_key_exists('image', $_REQUEST)) { $num=$_REQUEST['image']; for ($i=0; $i<10; $i++) { if (md5($i+$captcha_random_seed)==$num) { write_image_number($i); exit; //Вывод одной цифры и выход } } } exit; } //Печатаем заголовок документа echo ' <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html; charset=Windows-1251" http-equiv="content-type"> <title>Простая капча на PHP</title> </head> <body>'; $captcha_key=''; //mt_srand(time()+(double)microtime()*1000000); //Не нужно с PHP 4.2.0 print"<form action=\"".$_SERVER["PHP_SELF"]."\" method=\"post\">Защитный код: "; for ($i=0; $i<$captha_length; $i++) { $snum=mt_rand(0,9); $psnum=md5($snum+$captcha_random_seed); echo '<img src="'.$_SERVER["PHP_SELF"]."?image=$psnum\" border=\"0\" alt=\"\">\n"; $captcha_key.=$snum; } $captcha_key=md5("$captcha_key+$captcha_random_seed"); print" <input name=\"captcha_key\" type=\"hidden\" value=\"$captcha_key\"> <input name=\"user_captcha_number\" type=\"text\" maxlength=\"$captha_length\" size=\"$captha_length\"> (введите число, указанное на картинке) <input type=\"submit\" name=\"action\" value=\"OK\"></form>"; //проверка: if (isset($_REQUEST['action'])) { //была нажата кнопка $errormsg="<font color=red>Введённый код неверен!</font>"; if (!isset($_POST['user_captcha_number']) or !isset($_POST['captcha_key'])) { print "$errormsg"; exit; } $user_captcha_number=$_POST['user_captcha_number']; $captcha_key=$_POST['captcha_key']; if (md5("$user_captcha_number+$captcha_random_seed")!=$captcha_key) { print "$errormsg"; exit; } print "Всё верно</body></html>"; } ?> Так как скрипт вызывает сам себя для получения очередной картинки-цифры, нельзя перед выводом картинки ставить какой-нибудь HTML-код. А вот перед ветвью для вывода формы - можно, как и сделано в примере. Не уверен также, что уже нет ботов, читающих эти довольно стандартные цифровые последовательности. Попозже, может, сделаю из этого простенький модуль. Конечно, для его работы в форме всё равно нужно будет указывать текстовое поле user_captcha_number (число, введённое пользователем), скрытое поле captcha_key (зашифрованный "правильный ответ") и кнопку action (отправка формы). Разумеется, названия полей формы HTML можно изменить, тогда изменятся и названия соответствующих переменных в теле скрипта. Дэмо У приведённого выше кода можно найти, как минимум, один недостаток: в IE 7-8 сообщения "Код неправилен" или "Всё верно" не выводятся, если отправить форму клавишей Enter, а не кнопкой ОК. Печать из скрипта массива $_REQUEST строкой Code print_r ($_REQUEST); показала в Internet Explorer 8 следующее: Code Array ( [captcha_key] => 0d38b62fe1d3fb3cebe67a35c627c59a [user_captcha_number] => 4089 [__utma] => 96992031.150883131.1284642699.1285238584.1285244288.8 [phpbb2mysql_data] => a:2:{s:11:\"autologinid\";s:0:\"\";s:6:\"userid\";i:-1;} ) Видно, что в массиве нет записи [action] => OK, раз не нажималась кнопка ОК. Во всех остальных браузерах (Opera, Firefox, Google Chrome) такая запись есть независимо от способа отправки формы (клавишей Enter или кнопкой ОК). Легче всего решить эту проблему, просто определяя факт отправки данных по другому полю, например, поставив строку Code if (isset($_REQUEST['captcha_key'])) { //была нажата кнопка вместо Code if (isset($_REQUEST['action'])) { //была нажата кнопка В онлайн-демке так и сделано, всё работает, в том числе, в Internet Explorer. Слымзено [http://pers.narod.ru]
|
| |||
| |||
