Раньше будучи одним из "тех людей", я не знаю, что существует сжатый способ подвести итог, почему сопоставление с образцом является таким вкусным совершенством. Это основано на опыте.
Обратный, когда я только что поглядел на сопоставление с образцом и думал, что это был прославленный оператор переключения, я думаю, что не имел опыта при программировании с алгебраическими типами данных (кортежи и дизъюнктные объединения) и не вполне видел, что сопоставление с образцом было и конструкцией управления и обязательная конструкция. Теперь, когда я программировал с F#, я наконец "получаю его". Прохлада сопоставления с образцом происходит из-за слияния функций, найденных на языках функционального программирования, и таким образом, это нетривиально для outsider-looking-in для понимания.
я пытался подвести итог одного аспекта того, почему сопоставление с образцом полезно во втором из короткого ряда блога с двумя частями на дизайне API и языке; выезд часть первая и часть вторая .
Без постоянного состояния на стороне сервера я не вижу, чтобы CAPTCHA работала.
То, что вы предложили, небезопасно, поскольку злоумышленник может легко всегда POST своего собственного «скрытого поля» с сопоставлением Текст CAPTCHA.
Почему бы не выполнить CAPTCHA с другого веб-сервера, где у вас может быть постоянное состояние?
Вы можете попробовать сохранить кучу кодов капчи в базе данных. В качестве альтернативы, здесь есть интересное обсуждение альтернативных методов ввода капчи: Практические подходы капчи, не основанные на изображениях?
Действительно, некоторые довольно интересные методы, прочтите.
Сделайте скрытое поле ввода просто случайной последовательностью. Сохраните эти случайные данные в базе данных вместе с информацией о капче, чтобы вы могли найти по ним правильную капчу.
Вам также необходимо установить непродолжительное время жизни для каждой сгенерированной капчи. Наконец, вы можете хранить и отслеживать в базе данных количество попыток для каждой капчи и наложить на нее жесткое ограничение (3 попытки, и это постоянный сбой).
Можете ли вы предоставить им сертификат клиента в ответ на вызов CAPTCHA? Затем, как только они выбирают этот сертификат в браузере, он отправляется с каждым вызовом от клиента и может использоваться для аутентификации без сеансов и без дальнейших вызовов CAPTCHA.
Моя собственная идея, не знаю, хороша ли она:
1) Если пользователь вошел в систему, просто используйте некоторую хеш-функцию для его входа в систему и сгенерируйте с ней CAPTCHA,
2 ), если это регистрационная форма и т. д., просто хешируйте какое-то значение из поля формы (например, логин, когда пользователь закончил вводить его) и с помощью ajax покажите CAPTCHA с хешем из логина.
Надеюсь, что это понятно. :)
РЕДАКТИРОВАТЬ: Без AJAX: Регистрация в 2 этапа:
На этапе 1 мы собираем данные для входа в систему и т. Д. После отправки, мы направляем на ? Login = new_login
На этапе 2 у нас есть скрытый ввод с помощью GET ["login"]
и хеш от него в изображении CAPTCHA - после отправки мы должны все проверить ответ.
Вот мой подход (простите, если это кажется сложным):
при запросе страницы:
в форме:
страница captcha.php расшифровывает зашифрованный текст и генерирует изображение.
пользователь отправляет форму с кодом 'abcdaa' (и скрытым вводом $ crypt)
править: функция шифрования должна быть обратимой (дешифрованной), поскольку генератору изображения капчи потребуется исходный код.
Используйте технику приманки : поместите текстовое поле с жадным именем, например «электронная почта», в скрытое поле с помощью CSS (display: none; visibility: hidden;).
Когда вам нужно очистить форму, просто проверьте, пусто ли это поле, отправлено ли оно человеком (который не видит поле и поэтому не может его заполнить) или от спамера.
Вот почему обычно спамеры заполняют все поля на странице заранее заданными значениями перед отправкой формы ... и не мешают пользователю прочитать капчу.
Или положитесь на человеческое чтение , что-то вроде «Напишите первую $ x букву слова« $ word »в поле:»
Тогда вам нужно только отправить $ x и $ word на следующую страницу и проверьте ее (и, конечно, вы можете рандомизировать имена полей, чтобы быть более точными)
Я помню, что плагин для форума phpBB полагается на тот факт, что, обычно спам-боты выбирают первую доступную опцию (со значением) в полях
; Просто укажите первый вариант
Есть много способов защиты от спам-ботов, играя на одном факторе, которого у ботов никогда не будет: воображение
Как насчет этого решения? Я нашел эту статью "Sessionless PHP Captcha" в google и использовал в одном из своих проектов, это просто, без сессии и бесплатно. Есть какие-либо опасения по поводу безопасности RC4?
Необходимость в сеансе или базе данных возникает из-за необходимости скоординировать GET для изображения с html-страницей, содержащей его, поэтому как насчет того, чтобы использовать тот же код для вставьте изображение капчи: [img src = 'data: image / jpeg; base64, ...'], используйте случайную соль для хеширования текста, затем отправьте случайную соль и хеш вместе с изображением клиенту в одном GET?
При обратной передаче вы добавляете текст пользователя к соли, а затем сравниваете хэши. Просто интересно, насколько это безопасно ...