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

Форум PHP

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

 

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

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

тема: Защита от авторегистрации
 
 автор: 31   (30.07.2006 в 04:30)   письмо автору
 
 

Вообще видел что при регистрации нужно ввсти цифры на картинке. Вопрос: Как сделать регистрацию чтобы выводились числа не ввиде картинки а просто выводились цифры которые необходимо указать.

   
 
 автор: RV   (30.07.2006 в 05:15)   письмо автору
 
   для: 31   (30.07.2006 в 04:30)
 

в каком виде они будут выводится

   
 
 автор: Владимир22   (30.07.2006 в 05:19)   письмо автору
 
   для: 31   (30.07.2006 в 04:30)
 

Генерируйте любое число и требуйте повторить.

$kod = rand(1000,100000);  
if ($zifra !=$kod) {  //$zifra - это то, что вводит пользователь
echo "Ваше число не совпадает с тем, которое вы видите на экране!";
exit();
}

   
 
 автор: 31   (31.07.2006 в 02:24)   письмо автору
 
   для: Владимир22   (30.07.2006 в 05:19)
 

Владимир22, извините я не очень понял. Вот к примеру файл reg.php и пи реге нужно ввести эти цифры..... этот файл передает пост-данные файлу mainreg.php и вот этот код которые Вынаписали нужно указать в файле mainreg.php?

   
 
 автор: 31   (31.07.2006 в 03:09)   письмо автору
 
   для: 31   (31.07.2006 в 02:24)
 

и нужно чтобы это в файл число записывалось

   
 
 автор: Jura   (31.07.2006 в 03:57)   письмо автору
 
   для: 31   (30.07.2006 в 04:30)
 

Механизм очень прост:
1. случайная генерация числа (желательна зависимость от хоста, времени, часового пояса)
2. уникальный идентификатор случайного числа в базе для конкретного пользователя.
3. скрипт вывода картинки (отдельный коннект к базе по уникальному идентификатору)
4. скрипт проверки числа с идентификатором в базе - если случайное число по идентификатору совпало выполняем действие, если нет, то в цикле просим повторять ввод числа.

При генерации случайного числа и идентификатора уникального не должно быть прямых зависимостей. Только в этом случае это будет являться серьезной защитой.

   
 
 автор: 31   (31.07.2006 в 18:50)   письмо автору
 
   для: Jura   (31.07.2006 в 03:57)
 

к примеру вот так можно сгенирировать код

$num = mt_rand(0, 99999);


У меня возникли вопросы которые для Вас будут не трудны.
1) Как вывести случайное сгенирированное число
2) при вводе в форму нужно чтобы $num записывалось в файл и естественно если число сгенирированное не совпадется с числом введеное в форму пользователем должна выйти ошибка

   
 
 автор: Владимир22   (31.07.2006 в 19:42)   письмо автору
 
   для: 31   (31.07.2006 в 18:50)
 

На той же странице, где пользователь вводит данные, вставляете код генерации случайного числа (см. в первом примере) - в вашем случае это reg.php, потом скрытым полем отправляете его(число) обработчику, т.е. mainreg.php , который сравнивает его(число) с тем, что ввёл пользователь.Если не совпадает, то возвращает назад и выдаёт сообщение.

   
 
 автор: Roo$   (01.08.2006 в 01:44)   письмо автору
 
   для: Владимир22   (31.07.2006 в 19:42)
 

А как сделать так чтобы генерировались случайно и отображались и цифры и буквы в перемешку....

   
 
 автор: himic   (01.08.2006 в 12:11)   письмо автору
 
   для: Roo$   (01.08.2006 в 01:44)
 

Вот тебе и буквы и цифры случаенным образом
<?
srand
((double) microtime() * 100000);
$uniq_id uniqid(rand());
$temp='';
for(
$i=0;$i<=rand(3,4);$i++){
$temp.=substr($uniq_idrand(0,strlen($uniq_id))-,);
}
?>

   
 
 автор: Roo$   (01.08.2006 в 23:25)   письмо автору
 
   для: himic   (01.08.2006 в 12:11)
 

ОК.... Большое спасибо, а теперь объясните как на сайтах это выкладывают ввиде рисунка....

   
 
 автор: BAHO   (01.08.2006 в 23:36)   письмо автору
 
   для: Roo$   (01.08.2006 в 23:25)
 

Заголовок сообщения: PHP. Пишем защиту от регистраций ботов.

Итак, сегодня поговорим о защите своих сайтов/форумов/гостевых и т.д. от регистраций и постоянных реклам ботов.
Все, что нам понадобится, - php и прямые руки. Ну, и может быть еще какая-нибудь программа для рисования.
Писать защиту будем с использованием сессий. По-моему, это самый оптимальный вариант для небольших и средних проектов. Конечно, можно делать и с использованием базы данных, но этого мы делать не будем. Начнем...
Для начала напишем простой скрипт, который будет генерировать совершенно случайную надпись. Если вы хотите использовать только цифры, то решается все очень просто:
Код:
<?php 
$string 
mt_rand(10000,99999); // случайное число 
?>
И все... А если буквы, то это тоже очень легко, просто немного больше кода:
Код:
<?php 
$letters 
'abcdifghijklnmopqrstuvwxyz'// строка символов 
$chars = array(); 
$string ''
for (
$i=0;$i<strlen($letters);$i++) 

   
$chars[] = substr($letters,$i,1); // массив всех символов 

$length 5
for (
$i=0;$i<$length;$i++) 

   
$char mt_rand(0,count($chars)-1); // генерация случайного номера символа из массива 
   
$string .= $chars[$char]; // добавление случайного символа к строке 

?>
В итоге, $string - это наша случайная строка. В общем, при ее формировании можно извращаться, насколько хватит фантазии. При желании можно добавить туда и цифры, и заглавные буквы, и специальные символы.
Идем дальше. Теперь напишем формочку с для отображения картинки и ввода строки. И с самого начала стартуем сессию и генерируем строку.
Код:
<?php 
session_start
(); // наша сессия 
$letters 'abcdifghijklnmopqrstuvwxyz'
$chars = array(); 
$string ''
for (
$i=0;$i<strlen($letters);$i++) 

   
$chars[] = substr($letters,$i,1); 

$length 5
for (
$i=0;$i<$length;$i++) 

   
$char mt_rand(0,count($chars)-1); 
   
$string .= $chars[$char]; 

$_SESSION['string'] = $string// передача случайной строки в сессию 
?> 
<form action="verify.php" method="post"> 
<img src="img.php" alt="Anti-bot"><br> 
<input type="text" name="userstring"><br> 
<input type="submit" name="verify" value=" send "> 
</form>
А теперь приступаем к самому интересному - пишем код самой картинки, т.е. скрипт img.php.
Код:
<?php 
session_start
(); 
$img imagecreate(200,80); // создаем изображение размером 200х80 
$black imagecolorallocate($img,0,0,0); // определяем черный цвет 
$white imagecolorallocate($img,255,255,255); // белый цвет 
imagefill($img,0,0,$white); // заполняем изображение белым 
imagettftext($img,38,0,4,60,$black,'arial.ttf',$_SESSION['string']); // пишем строку из сессии черным цветом 
imagepng($img); // отдаем картинку в браузер 
imagedestroy($img); // удаляем ее из памяти 
header('Content-Type: image/png'); // даем знать браузеру, что это картинка png 
?>

Это пример, самой простой картинки, которая напишет нашу случайную строку на белом фоне. Важно: тут я использовал шрифт arial.ttf, вместо стандартных, для этого нужен сам файл шрифта, который будет лежать в одной директории со скриптом и поддержка функции imagettftext в php.
Но ведь есть боты, которым по силам прочитать такое, а мы этого не хотим, ведь так?
Извращаемся дальше - создадим небольшой шум.
Код:
<?php 
session_start
(); 
$img imagecreate(200,80); 
$black imagecolorallocate($img,0,0,0); 
$white imagecolorallocate($img,255,255,255); 
imagefill($img,0,0,$white); 
imagettftext($img,38,0,4,60,$black,'arial.ttf',$_SESSION['string']); 
$p 0
while (
$p<1000

   
$x mt_rand(1,199); // случайная координата пикселя шума по оси X 
   
$y mt_rand(1,79); // ось Y 
   
$pixel imagecolorat($img,$x,$y); // узнаем какой цвет используется на месте будущего пикселя шума 
   
$point = ($pixel == $black) ? $white $black// если был черный, красим пиксель белым, если белый - красим черным 
   
imagesetpixel($img,$x,$y,$point); // рисуем сам пиксель 
   
$p++; 

imagepng($img); 
imagedestroy($img); 
header('Content-Type: image/png'); 
?>

Получились небольшие помехи на картинке, называемые шумом. Число в цикле можно увеличивать - только не перестарайтесь, чтобы не слишком загружать сервер и, конечно же, чтобы сама строка на картинке была видна.
Теперь сделаем разноцветный фон. Его можно нарисовать в любой программе для рисования, хотя бы даже в paint. А потом укажем в скрипте путь до этого изображения и применим как фон. Вот так:
Код:
<?php 
session_start
(); 
$img imagecreatefrompng('ourpicture.png'); // создаем изобажение из уже существующего в формате png 
$black imagecolorallocate($img,0,0,0); 
$white imagecolorallocate($img,255,255,255); 
imagettftext($img,38,0,4,60,$black,'arial.ttf',$_SESSION['string']); 
$p 0
while (
$p<1000

   
$x mt_rand(1,199); 
   
$y mt_rand(1,79); 
   
$pixel imagecolorat($img,$x,$y); 
   
$point = ($pixel == $black) ? $white $black
   
imagesetpixel($img,$x,$y,$point); 
   
$p++; 

imagepng($img); 
imagedestroy($img); 
header('Content-Type: image/png'); 
?>

Получим картинку с надписью и шумом на нашем фоне. Замечу, что картинку я создавал в формате png, поэтому и функцию php использовал соответствующую - imagecreatefrompng. Для других форматов изображений есть и другие функции.
Все способы рисования защиты я показывать не буду - фантазируйте и создавайте сами. Просто на словах скажу, что можно еще нашу строку накладывать на саму себя, но с небольшим смещением, - опять же получится небольшое искажение. Или же каждый символ строки смещать по осям X и Y, даже окрашивать их в разные цвета. Можно выводить и какое-то математическое действие, как, например, сделано на нашем сайте при регистрации. Также можно писать случайное число прописью, что существенно усложнит жизнь ботам.
И, наконец, мы дошли до последнего скрипта - скрипта проверки введенной строки, verify.php.
Код:
<?php 
session_start
(); 
if (!empty(
$_POST['userstring'])) die('Вы ничего не написали!'); // проверяем введенную строку пользователем 
if ($_POST['userstring'] === $_SESSION['string']) echo 'Строка введена правильно.'// проверяем идентичность и даем ответ 
else echo 'Строка введена неправильно!'
?>

   
 
 автор: Roo$   (02.08.2006 в 00:18)   письмо автору
 
   для: BAHO   (01.08.2006 в 23:36)
 

У меня вылетают различные ошибки.... Вот например одна из них...
Fatal error: Call to undefined function: imagecreate() in C:\Inetpub\wwwroot\spam\img.php on line 3

Если не трудно, прекрепи гатовый исходник

   
 
 автор: 31   (02.08.2006 в 01:39)   письмо автору
 
   для: BAHO   (01.08.2006 в 23:36)
 

BAHO а вот допустм

session_start(); // наша сессия  
$letters = 'abcdifghijklnmopqrstuvwxyz';  
$chars = array();  
$string = '';  
for ($i=0;$i<strlen($letters);$i++)  
{  
   $chars[] = substr($letters,$i,1);  
}  
$length = 5;  
for ($i=0;$i<$length;$i++)  
{  
   $char = mt_rand(0,count($chars)-1);  
   $string .= $chars[$char];  
}  
$_SESSION['string'] = $string; // передача случайной строки в сессию  
?>  
<form action="verify.php" method="post">  
<img src="img.php" alt="Anti-bot"><br>  
<input type="text" name="userstring"><br>  
<input type="submit" name="verify" value=" send ">  
</form> 


просто добавить в форму где пользователь будет регистрироваться. и в та форма она передает пост данные файлу mainreg.php следовательно ваш код который лежит в файле verify.php

<?php  
session_start
();  
его тоже нужно занести в файл mainreg.php?

P.S и еще я попробовал ваш скрипт он работает как я хотела вот когда в поле ввожу сгенерированный код мне пишет Вы ничего не написали.......это так и должно быть?
if (!empty(
$_POST['userstring'])) die('Вы ничего не написали!'); // проверяем введенную строку пользователем  
if ($_POST['userstring'] === $_SESSION['string']) echo 'Строка введена правильно.'// проверяем идентичность и даем ответ  
else echo 'Строка введена неправильно!';  
?> 

   
 
 автор: 31   (02.08.2006 в 14:20)   письмо автору
 
   для: 31   (02.08.2006 в 01:39)
 

а нада делать так чтобы введенный пользователем код, который сгенерирован на картинке записывался в файл?

   
 
 автор: Roo$   (03.08.2006 в 22:38)   письмо автору
 
   для: 31   (02.08.2006 в 14:20)
 

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

   
 
 автор: 31   (04.08.2006 в 02:58)   письмо автору
 
   для: Roo$   (03.08.2006 в 22:38)
 

да с этим я уже разобрался.если сделать запрет на копирование то помоему нужно применять яваскрипт. в этом случае мне не подходит так как не все мобильные браузеры выполняют яваскрипт..

   
 
 автор: BAHO   (04.08.2006 в 20:08)   письмо автору
 
   для: 31   (04.08.2006 в 02:58)
 

2Roo$: у вас наверное библиотека gd2 отсутствует :) посмотрите phpinfo() свой....
2 31: н а чем вам картинка не угодила? если слишком большая, уменьшаем размер букв и картинки....
а если всё же захочется выводить строкой, то пожалуйста, просто выводите элемент массива $_SESSION.... вам же нужна защита от авторегистрации? ну вот и пожалуйста, не будут же роботы искать значение выведенной строки :)

   
 
 автор: koder   (04.08.2006 в 16:01)   письмо автору
 
   для: 31   (02.08.2006 в 01:39)
 

>P.S и еще я попробовал ваш скрипт он работает как я хотел. а
>вот когда в поле ввожу сгенерированный код мне пишет Вы
>ничего не написали.......это так и должно быть?
>if (!empty($_POST['userstring'])) die('Вы ничего не
>написали!'); // проверяем введенную строку пользователем
>if ($_POST['userstring'] === $_SESSION['string']) echo
>'Строка введена правильно.';

Вместо === использовать ==

   
 
 автор: the loser   (05.08.2006 в 01:52)
 
   для: koder   (04.08.2006 в 16:01)
 

>if (!empty($_POST['userstring'])) die('Вы ничего не написали!'); // проверяем введенную строку пользователем

просто empty

   
 
 автор: 31   (06.08.2006 в 03:01)   письмо автору
 
   для: the loser   (05.08.2006 в 01:52)
 

Помогите тут разобраться.вообщем сам этот код

<?php  
session_start
(); // наша сессия  
$letters 'abcdifghijklnmopqrstuvwxyz';  
$chars = array();  
$string '';  
for (
$i=0;$i<strlen($letters);$i++)  
{  
   
$chars[] = substr($letters,$i,1);  
}  
$length 5;  
for (
$i=0;$i<$length;$i++)  
{  
   
$char mt_rand(0,count($chars)-1);  
   
$string .= $chars[$char];  
}  
$_SESSION['string'] = $string// передача случайной строки в сессию  
?>  
<form action="verify.php" method="post">  
<img src="img.php" alt="Anti-bot"><br>  
<input type="text" name="userstring"><br>  
<input type="submit" name="verify" value=" send ">  
</form>

я уже совместил к своей форме (регистрации) И вот когда я начинаю регистрировать уже с сгенерированной картинкой мне пишет вы ничего не написали.хотя код я ввел правильный. почему так? а нужно чтобы сгенерированный код в БД (файлы) записывался?

   
 
 автор: RV   (06.08.2006 в 05:34)   письмо автору
 
   для: 31   (06.08.2006 в 03:01)
 

данные код только генерирует картинку и пихает ее в сессию. а кода для проверки тут нет

   
 
 автор: 31   (09.08.2006 в 14:26)   письмо автору
 
   для: RV   (06.08.2006 в 05:34)
 

а что тогда нужно сгенерированный код записывать в файл? или как то вызвать из сесии? Прошу прощения за сою настойчивость ну уж очень хотелось бы осуществить это желание.

   
 
 автор: RV   (09.08.2006 в 15:41)   письмо автору
 
   для: 31   (09.08.2006 в 14:26)
 

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

   
 
 автор: skor   (09.08.2006 в 16:51)   письмо автору
 
   для: RV   (09.08.2006 в 15:41)
 

http://img147.imageshack.us/my.php?image=captchayl6.png
ггг... ))

   
 
 автор: Jura   (11.08.2006 в 14:46)   письмо автору
 
   для: skor   (09.08.2006 в 16:51)
 

Хех... с формулами это вообще перебор...

   
 
 автор: 31   (09.08.2006 в 17:16)   письмо автору
 
   для: RV   (09.08.2006 в 15:41)
 

Спасибо! Попробую так как вы сказали.

   
Rambler's Top100
вверх

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