PHP Captcha без сеанса

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

Проблема в том, что обычные решения captcha от предотвращения роботизированных отправлений требуют сеанса для хранения строки, чтобы она соответствовала captcha.

Вопрос в том, есть ли способ решить проблему без использования сеансов? Что приходит мне на ум – служит для скрытого поля формы, содержащего некоторый хеш, а также поля ввода captcha, чтобы сервер затем мог сопоставлять эти два значения вместе. Но как мы можем сделать этот метод безопасным, чтобы его нельзя было легко использовать для перехвата captcha.

Необходимость сеанса или базы данных связана с необходимостью координировать GET для изображения с html-страницей, содержащей его, поэтому как использовать один и тот же код для вставки изображения captcha: [img src = 'data: image / jpeg; base64, … '], используйте случайную соль для хеширования ее текста, затем отправляя случайную соль и хэш вместе с изображением клиенту в одном GET?

При обратной передаче вы добавляете текст пользователя в соль, затем сравниваете хеши. Просто интересно, насколько это безопасно …

Используйте метод honeypot : поместите текстовое поле с жадным именем, как «электронная почта», в поле, скрытое CSS (display: none; visibility: hidden;).

Когда вам нужно дезинфицировать форму, просто проверьте, пустое ли это поле, отправляется человеком (это не может видеть поле и поэтому не может его заполнить), иначе, от спамера.

Вот почему обычно используется спамер, чтобы заполнить все поля на странице с предопределенными значениями перед отправкой формы … и не беспокоит пользователя для чтения captcha.

Иначе, полагайтесь на чтение людей , что-то вроде «Напишите первую букву $ x слова« $ word »в поле:

Затем вам нужно отправить только $ x и $ word на следующую страницу и проверить его (и, конечно, вы можете рандомизировать имя полей, чтобы быть более точными)

Я помню, что плагин для форума phpBB полагается на то, что, как правило, спам-боты выбирают первый вариант avaiable (со значением) в полях <select> ; Просто поставьте первый вариант <option value="kickmeplease">Yes, im a bot.</option>

Существует множество способов защитить от спам-ботов, играя на одном из факторов, которых ботов никогда не будет: воображение

Вы можете попытаться сохранить в базе данных кучу кода captcha. В качестве альтернативы, здесь приятно обсуждать альтернативные методы отслеживания: практические подходы CAPTCHA, основанные на изображениях?

некоторые довольно интересные техники действительно, прочитайте.

Попросите генератора CAPTCHA вернуть изображение и использовать засоленный хеш или пользовательский хеш для ответа (акцент на соленые / пользовательские). Попросите генератор нажать этот хэш в файл cookie. Затем сервер может проверить на основе значения в файле cookie. Для этого не требуется JavaScript, но если файлы cookie отключены, вам придется отказаться от другой техники.

Автоматическое заполнение UUID CAPTCHA вместе с ответом пользователя в POST. Очень просто.

просто сделайте математическую капчу;) 2 + 90 =? уравнение должно быть показано на изображении и вуаля;)

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

Вам также необходимо установить короткое время, чтобы жить для каждого сгенерированного капка. Наконец, вы можете хранить и отслеживать в базе данных количество попыток на каждом перехвате и налагать на него жесткий предел (3 догадки, и это постоянный сбой).

Без постоянной серверной части сервера я не вижу работу CAPTCHA.

То, что вы предложили, не является безопасным, так как злоумышленник может легко всегда отправлять POST свое собственное «скрытое поле» с соответствующим текстом CAPTCHA.

Почему бы не сделать CAPTCHA с другого веб-сервера, где вы можете иметь постоянное состояние?

Можете ли вы предоставить им сертификат клиента в ответ на вызов CAPTCHA? Затем, как только они выбирают этот сертификат в браузере, он отправляется с каждым вызовом от клиента и может использоваться для аутентификации без сеансов и без дополнительных вызовов CAPTCHA.

Вот мой взгляд на него (если он кажется сложным):

  1. на странице запроса:

    • вы генерируете случайный строковый код 'abcdef';
    • вы шифруете код с помощью предопределенного пароля: $ crypt = encrypt ($ captcha_code, 'password')
  2. в виде:

    • ссылка на изображение отправляется в браузер «captcha.php? $ crypt»
    • скрытый ввод устанавливается со значением $ crypt
  3. страница captcha.php расшифровывает зашифрованный текст и генерирует изображение.

  4. пользователь отправляет форму с кодом «abcdaa» (и скрытым вводом $ crypt)

  5. сервер проверяет, является ли шифрование ('abcdaa') == $ crypt

edit: функция шифрования должна быть обратимой (расшифровать), так как генератору изображения captcha потребуется исходный код.

Как насчет этого решения? Я нашел эту статью «Cвободный PHP Captcha» в Google, и я использовал один из моих проектов, это просто, без сеанса, и это бесплатно. Любые проблемы безопасности на RC4?

http://www.mythos-rini.com/blog/archives/732

Моя собственная идея, не знаю, хорошо ли это:

1) Если пользователь зарегистрирован, просто используйте некоторую хеш-функцию в своем логине и создайте с ним CAPTCHA,

2) если это форма регистра и т. Д., Просто хешируйте какое-либо значение из поля формы (например, логин, когда пользователь закончил его тип) и ajax show CAPTCHA с хешем от имени пользователя.

Надеюсь, это понятно. 🙂

EDIT: Без AJAX: регистрация 2 шагов:

В 1 мы собираем логин и т. Д. После отправки, мы направляемся к ?login=new_login

В 2 у нас есть скрытый ввод с GET["login"] и хеш из него в изображении CAPTCHA – после отправки у нас есть все, чтобы проверить ответ.

Форма с подтверждением:

 $errorsucc = ''; if (isset($_POST["captcha_check"])) { $code = str_decrypt($_POST["captcha_check"]); if (empty($_POST['captcha_code'])) { $errorsucc = '<p style="color:red">Please Enter the security code.</p>'; } elseif(!( $code == $_POST['captcha_code'] && !empty($code) )) { $errorsucc = '<p style="color:red">Incorrect Code Entered.</p>'; } else { $errorsucc = '<p style = "green">Nice, you entered the correct code.</p>'; } } $captcha = new CaptchaCode(); $code = str_encrypt($captcha->generateCode(6)); ?> <html> <title>Sessionless Captcha</title> <div style = "background: #e2e2e2; padding: 20px; width: 20%; box-shadow: 5px 5px #ccc;"> <?php echo $errorsucc; ?> <form name="captchaform" method="post"> <table border="0" cellpadding="4" cellspacing="0"> <tr><td valign="middle" align="left">Security Code:</td> <td valign="middle" align="left"><img src="captcha_images.php?width=150&height=50&code=<?php echo $code?>" /></td> </tr> <tr><td valign="middle" align="left">Enter Code:</td> <td valign="middle" align="left"><input id="captcha_code" name="captcha_code" style="width:150px" type="text" /></td> </tr> <tr><td valign="top" align="left"> </td> <td valign="top" align="left"> <input border="0" type="submit" value="Submit" /> </td> </tr> </table> <input type="hidden" name="captcha_check" value="<?php echo $code?>" /> </form> </div> </html> 

Создавайте изображения так же, как и любые другие файлы:

 /* font size will be 75% of the image height */ $font_size = $height * 0.75; $image = @imagecreate($width, $height) or die('Cannot initialize new GD image stream'); /* set the colours */ $background_color = imagecolorallocate($image, 255, 255, 255); $text_color = imagecolorallocate($image, 0, 26, 26); $noise_color = imagecolorallocate($image, 25, 89, 89); /* generate random dots in background */ for( $i=0; $i<($width*$height)/3; $i++ ) { imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color); } /* generate random lines in background */ for( $i=0; $i<($width*$height)/150; $i++ ) { imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color); } /* create textbox and add text */ $textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function'); $x = ($width - $textbox[4])/2; $y = ($height - $textbox[5])/2; imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function'); /* output captcha image to browser */ header('Content-Type: image/jpeg'); imagejpeg($image); imagedestroy($image); 

Загрузите демонстрационные файлы по этой ссылке: создайте незашифрованный Captcha в PHP