• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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() выдает уже новое значение, которое не совпадает со значением на картинке
 
Не мучайся и возьми 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 раз сделаешь цикл рандомность не увеличится.
 
Немного неверно.
Три (два) файла:
- в первом генерируешь число, и кладёшь его в сессию (не в куку)
- во втором - "рожаешь" картинку
- в третьем (это может быть и первый) - делаешь проверку.

Если делаешь проверку там же, где генерируешь число - то проверку делать ДО генерации нового числа.
 
первый (он же третий) файл - 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;
}
 
У меня на сайте в гостевой книге стоит защита от спама с 2005 года ни одного спамерского сообщения!!!

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

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab