|
|
|
| Вообще видел что при регистрации нужно ввсти цифры на картинке. Вопрос: Как сделать регистрацию чтобы выводились числа не ввиде картинки а просто выводились цифры которые необходимо указать. | |
|
|
|
|
|
|
|
для: 31
(30.07.2006 в 04:30)
| | в каком виде они будут выводится | |
|
|
|
|
|
|
|
для: 31
(30.07.2006 в 04:30)
| | Генерируйте любое число и требуйте повторить.
$kod = rand(1000,100000);
if ($zifra !=$kod) { //$zifra - это то, что вводит пользователь
echo "Ваше число не совпадает с тем, которое вы видите на экране!";
exit();
}
|
| |
|
|
|
|
|
|
|
для: Владимир22
(30.07.2006 в 05:19)
| | Владимир22, извините я не очень понял. Вот к примеру файл reg.php и пи реге нужно ввести эти цифры..... этот файл передает пост-данные файлу mainreg.php и вот этот код которые Вынаписали нужно указать в файле mainreg.php? | |
|
|
|
|
|
|
|
для: 31
(31.07.2006 в 02:24)
| | и нужно чтобы это в файл число записывалось | |
|
|
|
|
|
|
|
для: 31
(30.07.2006 в 04:30)
| | Механизм очень прост:
1. случайная генерация числа (желательна зависимость от хоста, времени, часового пояса)
2. уникальный идентификатор случайного числа в базе для конкретного пользователя.
3. скрипт вывода картинки (отдельный коннект к базе по уникальному идентификатору)
4. скрипт проверки числа с идентификатором в базе - если случайное число по идентификатору совпало выполняем действие, если нет, то в цикле просим повторять ввод числа.
При генерации случайного числа и идентификатора уникального не должно быть прямых зависимостей. Только в этом случае это будет являться серьезной защитой. | |
|
|
|
|
|
|
|
для: Jura
(31.07.2006 в 03:57)
| | к примеру вот так можно сгенирировать код
$num = mt_rand(0, 99999);
|
У меня возникли вопросы которые для Вас будут не трудны.
1) Как вывести случайное сгенирированное число
2) при вводе в форму нужно чтобы $num записывалось в файл и естественно если число сгенирированное не совпадется с числом введеное в форму пользователем должна выйти ошибка | |
|
|
|
|
|
|
|
для: 31
(31.07.2006 в 18:50)
| | На той же странице, где пользователь вводит данные, вставляете код генерации случайного числа (см. в первом примере) - в вашем случае это reg.php, потом скрытым полем отправляете его(число) обработчику, т.е. mainreg.php , который сравнивает его(число) с тем, что ввёл пользователь.Если не совпадает, то возвращает назад и выдаёт сообщение. | |
|
|
|
|
|
|
|
для: Владимир22
(31.07.2006 в 19:42)
| | А как сделать так чтобы генерировались случайно и отображались и цифры и буквы в перемешку.... | |
|
|
|
|
|
|
|
для: 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_id, rand(0,strlen($uniq_id))-1 ,1 );
}?>
|
| |
|
|
|
|
|
|
|
для: himic
(01.08.2006 в 12:11)
| | ОК.... Большое спасибо, а теперь объясните как на сайтах это выкладывают ввиде рисунка.... | |
|
|
|
|
|
|
|
для: 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 'Строка введена неправильно!';
?>
|
| |
|
|
|
|
|
|
|
для: BAHO
(01.08.2006 в 23:36)
| | У меня вылетают различные ошибки.... Вот например одна из них...
Fatal error: Call to undefined function: imagecreate() in C:\Inetpub\wwwroot\spam\img.php on line 3
Если не трудно, прекрепи гатовый исходник | |
|
|
|
|
|
|
|
для: 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 в 01:39)
| | а нада делать так чтобы введенный пользователем код, который сгенерирован на картинке записывался в файл? | |
|
|
|
|
|
|
|
для: 31
(02.08.2006 в 14:20)
| | А если сделать простой вывод чисел не как рисунок... А просто как оно есть... А чтобы пользователь не копирывал данное число а затем встовлял в нужное поле, запретить ему копирование страницы с помощью спец.тегов?! | |
|
|
|
|
|
|
|
для: Roo$
(03.08.2006 в 22:38)
| | да с этим я уже разобрался.если сделать запрет на копирование то помоему нужно применять яваскрипт. в этом случае мне не подходит так как не все мобильные браузеры выполняют яваскрипт.. | |
|
|
|
|
|
|
|
для: 31
(04.08.2006 в 02:58)
| | 2Roo$: у вас наверное библиотека gd2 отсутствует :) посмотрите phpinfo() свой....
2 31: н а чем вам картинка не угодила? если слишком большая, уменьшаем размер букв и картинки....
а если всё же захочется выводить строкой, то пожалуйста, просто выводите элемент массива $_SESSION.... вам же нужна защита от авторегистрации? ну вот и пожалуйста, не будут же роботы искать значение выведенной строки :) | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: 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>
|
я уже совместил к своей форме (регистрации) И вот когда я начинаю регистрировать уже с сгенерированной картинкой мне пишет вы ничего не написали.хотя код я ввел правильный. почему так? а нужно чтобы сгенерированный код в БД (файлы) записывался? | |
|
|
|
|
|
|
|
для: 31
(06.08.2006 в 03:01)
| | данные код только генерирует картинку и пихает ее в сессию. а кода для проверки тут нет | |
|
|
|
|
|
|
|
для: RV
(06.08.2006 в 05:34)
| | а что тогда нужно сгенерированный код записывать в файл? или как то вызвать из сесии? Прошу прощения за сою настойчивость ну уж очень хотелось бы осуществить это желание. | |
|
|
|
|
|
|
|
для: 31
(09.08.2006 в 14:26)
| | код генерирует картинку и помещает в сессию номер, который на картинке.
там где вы сверяете, стартуете сессию и сверяете два номера. один от пользователя, другой из сессии | |
|
|
|
|
|
|
|
|
для: skor
(09.08.2006 в 16:51)
| | Хех... с формулами это вообще перебор... | |
|
|
|
|
|
|
|
для: RV
(09.08.2006 в 15:41)
| | Спасибо! Попробую так как вы сказали. | |
|
|
|