Сравнение введенного пользователем значения CAPTCHA с ожидаемым значением, сохраненным в сеансе - PullRequest
1 голос
/ 14 апреля 2011

Я пытаюсь внедрить простую капчу в форму, которую я строю, но я столкнулся с проблемой, которую я не могу решить сам.

Я использую простой код для генерации случайного числа, например, так ...

$randomnr = rand(1000, 9999);
$_SESSION['randomnr2'] = md5($randomnr);

.... а затем еще немного кода, чтобы сгенерировать изображение случайного числа и отобразить его на странице. Я против этого за справедливость, как это ....

if (strlen($captcha) !== ($_SESSION['randomnr2'])) { 
    $error['captcha'] = "CAPTCHA error. Please try again";
}

Как мне проверить значение, которое было введено в поле ввода капчи, по случайному числу, которое хранится в сеансе randomnr2?

Ответы [ 3 ]

1 голос
/ 14 апреля 2011

Я не уверен, почему вы проверяете длину строки по хеш-строке md5, но предполагая, что $captcha - это число от пользователя, вы можете просто сделать это:

if(md5($captcha) !== $_SESSION['randomnr2']) {
  $error['captcha'] = "CAPTCHA error. Please try again";
}
0 голосов
/ 14 апреля 2011
<div id='captcha_to_show' style='border:1px solid silver;'>gobldeygook</div>
<input name='captcha' id='captcha'>

...

прикреплено с помощью scriptmonkey ...

$('document').ready(function(){
  $('#captcha').val($('#captcha_to_show').html());
});

загляните в скрипт с открытым исходным кодом. ваша реализация потребует отправки этой капчи по странице таким образом, чтобы ее значение можно было увидеть при любом обращении к странице, и этот человек / бот / все, что может заполнить проверяющее поле соответствующим образом, так что у вас фактически нулевая защита. вот почему капчи используют либо извилистые образы, которые трудно или невозможно прочитать с помощью сценария, либо семантические вопросы, которые люди лучше понимают в контексте, чем боты, например [«Как бы вы сказали, что представляют собой сумму 1 и 3?» === 4]. и да, более простые капчи изображений с установленными шрифтами, интервалом и размером могут быть взломаны с помощью своего рода атаки по словарю в виде пиксельного шаблона.

0 голосов
/ 14 апреля 2011

PHP автоматически преобразует что-либо в строку (если это возможно) для strlen(), поэтому

echo strlen(42); 
echo strlen('42');

будет выводить «2», даже если первое из них является целым числом.Чтобы сравнить переданное значение со значением хранилища, достаточно просто

if ($_SESSION['randomnr2'] === (int)$captcha) {
   ... it matched ...
}

. Вы захотите снова преобразовать переданное значение в int, так как все в массивах PHP $ _GET / POST обрабатывается внутренне.в виде строки.

...