Captcha

  • Автор темы nws
  • Дата начала
Статус
Закрыто для дальнейших ответов.
N
#1
У меня есть 3 файла:

В первом, generator.php, я генерирую число

Код:
<?php

function generator()
{
for ($i = 0; $i < 10; $i++)
{
$q = mt_rand(0, $i);
$q1 = mt_rand(0, $i);
$q2 = mt_rand(0, $i);
$q3 = mt_rand(0, $i);
}
$string = $q . " " . $q1 . " " . $q2 . " " . $q3;
return $string;
}

?>

Во втором, я "склеиваю" число из генератора с картинкой

Код:
<?php
require_once "generator.php";
header ("Content-type: image/gif");
$im = imagecreate (120,50);
$black = imagecolorallocate ($im, 0, 0, 0);
$white = imagecolorallocate ($im, 255, 255, 255);
$x = imagesx($im);
$y = imagesy($im);
imagettftext ($im, 30, 0, $x-120, $y-10, $white, getcwd()."/ARIAL.TTF", generator());

imagegif ($im);
imagedestroy ($im);


?>
В третьем, я делаю проверку: совпадает ли число введенной юзером с CAPTCHA

Код:
<?php
require_once "generator.php";
@$cpt = $_POST['txt_capt'];
if ($cpt == generator())
{
echo "<h1>OK</h1>";
}
else
{
exit("Vvedite text s kartinki");
}
?>
Проблема заключается в том, что generator() выдает уже новое значение, которое не совпадает со значением на картинке
 
M

MajestiC

#2
Не мучайся и возьми KCaptcha http://captcha.ru/kcaptcha/

Ты сравниваешь один generator() c другим generator(), получается сравниваешь 2 абсолютно рандомных числа.

Надо при показе картинки сохранять в сессии значение этого генератора, а потом в 3-ем файле сравнивать то, что лежит в сессии и то, что лежит в посте.

for ($i = 0; $i < 10; $i++)
{
$q = mt_rand(0, $i);
$q1 = mt_rand(0, $i);
$q2 = mt_rand(0, $i);
$q3 = mt_rand(0, $i);
}
Порадовал =)))) От того, что ты 10 раз сделаешь цикл рандомность не увеличится.
 
M

maykoff

#3
Немного неверно.
Три (два) файла:
- в первом генерируешь число, и кладёшь его в сессию (не в куку)
- во втором - "рожаешь" картинку
- в третьем (это может быть и первый) - делаешь проверку.

Если делаешь проверку там же, где генерируешь число - то проверку делать ДО генерации нового числа.
 
M

maykoff

#4
первый (он же третий) файл - HTML с картинкой
Код:
<?php
session_start();
$answer = '';
//проверка
if(@$_POST['contr'] == @$_SESSION['contr_num'])
{
$answer = 'OK!';
}

//генерация числа
mt_srand (time());
$r = mt_rand (1000,1000000);
$_SESSION['contr_num'] = substr ((string)$r,0,4);
?>
<HTML>
<HEAD>
<TITLE>CAPTCHA</TITLE>
</HEAD>
<BODY>

<p><b><?=$answer?></b></p>

<FORM METHOD="post" >
<br>
Спам-контроль:<img src="imgcontr.php">       <INPUT TYPE="text" NAME="contr" size="4">
<br><br>
<INPUT TYPE="submit" NAME="submit" VALUE="GO">
</FORM>

</BODY>
</HTML>
второй файл - собственно, картинка imgcontr.php
Код:
<?php
require('./functions.inc');
header ("Content-type: image/gif");
session_start();
$img=antiflood($_SESSION['contr_num'],'000000','00FF00','../include/comic.ttf');
imagegif ($img);
imagedestroy ($img);
?>
comic.ttf - файл шрифта, которым собираешься писать


функция antifllood
Код:
function antiflood($control_number,$bgcolor,$txtcolor,$pathfont)
{
if(strlen((string)((int)$control_number)) != 4) return false;
if(!file_exists($pathfont)) return false;
$im = @imagecreate (80,30);
$background_color = imagecolorallocate ($im,hexdec(substr($bgcolor,0,2)),hexdec(substr($bgcolor,2,2)),hexdec(substr($bgcolor,4,2)));
$text_color = imagecolorallocate ($im, hexdec(substr($txtcolor,0,2)),hexdec(substr($txtcolor,2,2)),hexdec(substr($txtcolor,4,2)));
mt_srand (time());
for($i = 0;$i < 4;$i++)
{  
$angle=mt_rand(-30,30);
$dh=mt_rand(-5,5);
$df=mt_rand(-2,2);
imagettftext ($im,(10+$df),$angle,(10+$i*15),(20+$dh),$text_color,$pathfont,substr($control_number,$i,1));
}
return $im;
}
 
1

1c-nik

#5
У меня на сайте в гостевой книге стоит защита от спама с 2005 года ни одного спамерского сообщения!!!

Все настолько просто, что сделать это реально всем. На смой странице где размещена форма для нового сообщения есть скрытое поле, в котором, с помощью скрипта на java накапливается счетчик нажатия клавиши на клавиатуру на полях формы. Значение этого поля передается серверу, если оно меньше например 10, то сообщение просто напросто не принммается.)))
 
P

Programmer_Hard

#7
У меня на сайте в гостевой книге стоит защита от спама с 2005 года ни одного спамерского сообщения!!!

Все настолько просто, что сделать это реально всем. На смой странице где размещена форма для нового сообщения есть скрытое поле, в котором, с помощью скрипта на java накапливается счетчик нажатия клавиши на клавиатуру на полях формы. Значение этого поля передается серверу, если оно меньше например 10, то сообщение просто напросто не принммается.)))
ну тут любая капча пока не станет массовой она будет на 100% защищать от спама, пока шпамер не разберется с механизмом самой формы и кепчи...
 
Статус
Закрыто для дальнейших ответов.