Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Нужен скрипт защитной картинки от авто-рег
 
 автор: bartik   (21.09.2006 в 21:25)   письмо автору
 
 

Нужен скрипт защитной картинки от авто-рег, пожалуйста и объясните, как проверять верно ли введено значение.

   
 
 автор: Ressfourt   (21.09.2006 в 21:29)   письмо автору
 
   для: bartik   (21.09.2006 в 21:25)
 

самый простой пример это через Сессии .. ты создаешь картинку пишешь на нее код этот же код ты регистрируешь в сессию , а после просто проверяешь какой код ввели с картинки через форму с сессией

например if($_SESSION['code'] != $_POST['code'] )
{
echo "Error";
}
else
{
echo "True";
}

   
 
 автор: Unkind™   (21.09.2006 в 21:36)   письмо автору
 
   для: Ressfourt   (21.09.2006 в 21:29)
 

Ressfourt
Вашего кода недостаточно.


<?php
/*
Если я удалю cookie с SID, то $_SESSION['code'] существовать не будет,
примет пустое значение при вызове.
$_POST['code'] тоже могу не посылать, либо пустым его сделать.
В итоге они оба имеют одинаковое значение.
Нужно тогда сделать так:
*/

if($_SESSION['code'] == $_POST['code'] && !empty($_SESSION['code']))
{
echo 
"OK";
}
else
{
die(
"Error");
}
?>

   
 
 автор: indexer   (21.09.2006 в 21:46)   письмо автору
 
   для: Unkind™   (21.09.2006 в 21:36)
 

Наслаждайтесь, картинка не только просто выводит буквы, но и крутит их и добавляет шум ну это уже от сканеров картинок

<?php
session_start
();
$session_kod='';
$im=imagecreatefromjpeg("back.jpg");//файл с фоном
$tc=imagecolorallocate($im220,220,255);//цвет кода
$tp1=imagecolorallocate($im255,000,000);//цвет пикселей шума1
$tp2=imagecolorallocate($im000,255,000);//цвет пикселей шума2
$tp3=imagecolorallocate($im000,000,255);//цвет пикселей шума3
for($i=1;$i<99;$i++) imagesetpixel($imRand(1,130), Rand(124), $tp1);//шумы1
for($i=1;$i<99;$i++) imagesetpixel($imRand(1,130), Rand(124), $tp2);//шумы2
for($i=1;$i<99;$i++) imagesetpixel($imRand(1,130), Rand(124), $tp3);//шумы3

$arr_letter=array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z');
$arr_x=array(30,46,62,78,94);//расстановка попикселям букв
$arr_kod=array();
for (
$i_zn=0;$i_zn<5;$i_zn++){$i_rand=$arr_letter[rand(2,24)];imagettftext($im,  15,rand(-15,15),$arr_x[$i_zn],rand(15,24),$tc,'font.ttf'$i_rand);$arr_kod[]=$i_rand;}

$security_kod=implode(""$arr_kod);//сборка массива
$_SESSION['session_kod'] =md5($security_kod);//сохранение в сессии
header("Content-type: image/jpg");
imagejpeg($im);
imagedestroy($im);

/*

В файле с формой пишем <img src="picture.php">
В файле, который проверяет данные формы, сравниваем значение поля в введенными символами и зарегистрированную сессию.

В файле check.php проверяем:
PHP:
<?php
session_start();
if ($_POST['text']==$_SESSION['session_kod']) {echo "Код введен верно";}
else {echo "Код введен не верно"; }
?>
*/
?>

   
 
 автор: indexer   (21.09.2006 в 21:52)   письмо автору
 
   для: indexer   (21.09.2006 в 21:46)
 

Момент не догледел там же MD5 задействовано
тогда проверяем так


<?php
if (md5 ($_POST['text'])==$_SESSION['session_kod']) {echo "Код введен верно";} 
else {echo 
"Код введен не верно"; }
?>
//$_POST['text'] то что передал пользователь, проганяем все через MD5 и сравниваем Хеши

   
 
 автор: tuder   (22.09.2006 в 07:36)   письмо автору
 
   для: indexer   (21.09.2006 в 21:46)
 

>Наслаждайтесь, картинка не только просто выводит буквы, но и крутит их и добавляет шум ну это уже от сканеров картинок

Что-то не удаётся насладится. :-( Картинка не создаётся.
Я уже вот это:

>

>$im=imagecreatefromjpeg("back.jpg");//файл с фоном
>


Заменил на такое:

$im = @imagecreate(130, 24); 
$background_color = imagecolorallocate($im, 255, 255, 255);


и back.jpg подсовывал... Что-то не найду, в чём причина.

   
 
 автор: Ressfourt   (21.09.2006 в 21:48)   письмо автору
 
   для: Unkind™   (21.09.2006 в 21:36)
 

я показал самый простой пример :)

   
 
 автор: cheops   (21.09.2006 в 21:51)   письмо автору
 
   для: bartik   (21.09.2006 в 21:25)
 

Возможно вас заинтересует скрипт по ссылке http://www.softtime.ru/info/randomimage.php

   
 
 автор: mech   (21.09.2006 в 22:02)   письмо автору
 
   для: bartik   (21.09.2006 в 21:25)
 

Можно обойтись без сессий. Создавать в БД таблицу с id и code. Но только проблемы будут с TTL кода

   
 
 автор: indexer   (21.09.2006 в 23:00)   письмо автору
 
   для: mech   (21.09.2006 в 22:02)
 

даже не вздумайте, грузть в базу картинки. за такие дела надо голову отрывать, база не для того сделана, хоть и может принять картинки.

   
 
 автор: Unkind™   (22.09.2006 в 01:02)   письмо автору
 
   для: indexer   (21.09.2006 в 23:00)
 

Он, по-моему, имел ввиду не загружать в БД картинку, а сделать что-то вроде своих сессий...
Все равно лишнее...

   
 
 автор: indexer   (22.09.2006 в 01:50)   письмо автору
 
   для: Unkind™   (22.09.2006 в 01:02)
 

bartik какой вариант выбрали?

Извините сразу не понял, Можно конечно случайно выбрать из базы ссылку на картинку и ее показать, передать скрипту что за картинка была выбрана, и сравнить оба значения. Но тут есть несколько но.
Во первых все равно придется стартовать сессию(можно обойти конечно проверкой ip мол вы уже посылали с этого ip)либо сразу после отправки использовать редирект. потому что если нажать на кнопку обновить данные опять будут отправлены (так и надо делать).
Во вторых большой ли код можно создать таким образом? хотя очень большой он конечно не нужен.

Я так думаю что при отправке чего либо всегда нужно стартовать сессию если ее еще нет, очень удобно записывать в нее некоторые переменные, так почему бы не воспользоваться? Зачем ломать голову и придумывать велосипед.

   
 
 автор: bartik   (22.09.2006 в 01:05)   письмо автору
 
   для: mech   (21.09.2006 в 22:02)
 

Всем спасибо

   
 
 автор: bartik   (22.09.2006 в 14:59)   письмо автору
 
   для: bartik   (22.09.2006 в 01:05)
 

Сабж нашёл данный код от антиботов, но проблема при проверке, как бы вы проверяли? я пробывал через if но нифига не выходит.... help me please

<?php 
class genrandomimage
{
  var 
$lenght 7// Длина строки
  
var $string ''// Результирующая строка

  # Генерация строки
  
function genstring()
    {
      
$chars = array ('1''2''3''4''5''6''7''8''9''0');
      
$result_string '';

      for(
$i 0$i $this -> lenght$i++)
        {
          
$random_char mt_rand0, ( count $chars ) - ) );
          
$result_string .= $chars[$random_char];
        }
      
$this -> string $result_string;
    }

  
# Генерация изображения
  
function genimage()
    {
      
$im imagecreate10 $this -> lenght 520 );

      
$gray imagecolorallocate$im228228228 );
      
$black_1 imagecolorallocate$im150150150 );
      
$black imagecolorallocate$im00);
      
$white imagecolorallocate$im 255255255 );
      
$string imagecolorallocate$im909090 );

      
/* Генерация шума */
      
for($i = -2$i ceil ( ( 10 $this -> lenght ) / ); $i++)
        {
          
imageline$im$i 520$i 200$black_1 );
        }
      for(
$i = -2$i ceil ( (10 $this -> lenght) / ); $i++)
        {
          
imageline$im$i 5+2020$i 0$white );
        }
      
/* Конец генерации шума */

      # Рисуем строку на картинке
      
imagestring$im562$this -> string$string );

      
# Рамка
      
imageline$im00,  10*$this -> lenght 50$black );
      
imageline$im019,  10*$this -> lenght 519$black );
      
imageline$im00,  020$black );
      
imageline$im10*$this -> lenght 40,  10*$this -> lenght 420$black );

      
header('Content-type: image/png');
      
imagepng($im);
    }

}


session_start();
session_name('sec_code');

$im = new genrandomimage ();
$im->genstring();

$_SESSION['sec_code_session'] = $im->string;

$im->genimage();

 

?> 

   
 
 автор: Unkind™   (22.09.2006 в 15:24)   письмо автору
 
   для: bartik   (22.09.2006 в 14:59)
 

Нужно создать форму...

form.php

<?php
header
("Content-type: text/html; charset=windows-1251");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-cache, must-relative");

echo <<< END
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Форма</title>
</head>
<body>
<form action="handler.php" method="post">
Текст:<br />
<input type="text" name="text" /><br />
<img src="code.php" alt="CODE" /><br />
Введите код с картинки:<br />
<input type="text" name="code" /><br />
<input type="submit" value="[OK]" /><br />
</form>
</body>
</html>
END;
?>


И проверка...
handler.php

<?php
session_start
();
if(
$_SESSION['sec_code_session'] != $_POST['code'] or empty($_POST['code']))
{
header("Content-type: text/html; charset=windows-1251");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-cache, must-relative");

echo <<< END
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Error</title>
</head>
<body>
Ошибка: проверочный код введен неверно...
<a href="javascript:history.back(1)">Назад</a><br />
</body>
</html>
END;
die();
}

//Остальной код...
?>

   
 
 автор: bartik   (22.09.2006 в 18:20)   письмо автору
 
   для: Unkind™   (22.09.2006 в 15:24)
 

Спасибо я понял я забыл сесию открывать =)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования