Капча PHP без сессии

Раньше будучи одним из "тех людей", я не знаю, что существует сжатый способ подвести итог, почему сопоставление с образцом является таким вкусным совершенством. Это основано на опыте.

Обратный, когда я только что поглядел на сопоставление с образцом и думал, что это был прославленный оператор переключения, я думаю, что не имел опыта при программировании с алгебраическими типами данных (кортежи и дизъюнктные объединения) и не вполне видел, что сопоставление с образцом было и конструкцией управления и обязательная конструкция. Теперь, когда я программировал с F#, я наконец "получаю его". Прохлада сопоставления с образцом происходит из-за слияния функций, найденных на языках функционального программирования, и таким образом, это нетривиально для outsider-looking-in для понимания.

я пытался подвести итог одного аспекта того, почему сопоставление с образцом полезно во втором из короткого ряда блога с двумя частями на дизайне API и языке; выезд часть первая и часть вторая .

9
задан Anton N 23 September 2009 в 12:32
поделиться

9 ответов

Без постоянного состояния на стороне сервера я не вижу, чтобы CAPTCHA работала.

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

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

0
ответ дан 4 December 2019 в 21:50
поделиться

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

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

1
ответ дан 4 December 2019 в 21:50
поделиться

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

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

0
ответ дан 4 December 2019 в 21:50
поделиться

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

0
ответ дан 4 December 2019 в 21:50
поделиться

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

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

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

Надеюсь, что это понятно. :)

РЕДАКТИРОВАТЬ: Без AJAX: Регистрация в 2 этапа:

На этапе 1 мы собираем данные для входа в систему и т. Д. После отправки, мы направляем на ? Login = new_login

На этапе 2 у нас есть скрытый ввод с помощью GET ["login"] и хеш от него в изображении CAPTCHA - после отправки мы должны все проверить ответ.

0
ответ дан 4 December 2019 в 21:50
поделиться

Вот мой подход (простите, если это кажется сложным):

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

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

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

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

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

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

0
ответ дан 4 December 2019 в 21:50
поделиться

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

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

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

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

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

Я помню, что плагин для форума phpBB полагается на тот факт, что, обычно спам-боты выбирают первую доступную опцию (со значением) в полях