• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Captcha

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

nws

У меня есть 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

Не мучайся и возьми 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

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

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

maykoff

первый (он же третий) файл - 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

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

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

Kmet

Well-known member
25.05.2006
904
8
BIT
0
1c-nik
просто сработал метод неуловимого джо.
 
P

Programmer_Hard

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!