Как добавить поля медового горшка в мои формы? - PullRequest
12 голосов
/ 16 января 2012

Я читал о добавлении полей медового банка в мои формы для борьбы с ботами / спамом. Единственная проблема в том, что у них нет руководств или чего-либо еще, с чего начать. Многие сайты говорят, что нужно создать скрытое поле, которое заполнит только спам-бот. Но так как я новичок в этом, не знаю, с чего начать в моем приложении. Может ли кто-нибудь дать мне совет, как это настроить? Я пытаюсь сделать так, чтобы моя страница регистрации в Devise использовала поля медового банка.

Ответы [ 5 ]

18 голосов
/ 16 января 2012

Основная идея, стоящая за капчами honeypot, заключается в том, что у вас есть скрытое (через CSS) поле с именем что-то вроде «form», «email» или «content», которое (для бота, просто читающего имя поля) выглядит так, как должно быть заполнено. Затем, когда сервер просматривает отправку, вы убедитесь, что эти скрытые поля не заполнены. Если это не так, то вы помечаете пост как бот.

Вот хорошо объясненный пример (с некоторым кодом в ASP), а - это Rails Gem, который предоставляет капчи honeypot.

То, что Rails Gem Я связал, похоже, что его очень легко использовать после установки:

  <% form_tag comments_path, :honeypot => true do -%>
  ...
  <% end -%>

Хотя, если вам интересно узнать о подходе, а не просто реализовать его, я бы порекомендовал вам сделать свой собственный. Если вы катаетесь по своему усмотрению, важно убедиться, что поле скрыто с помощью CSS (или другого стиля / позиционирования), а не input type="hidden" - иначе бот может не заполнить поле.

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


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

1 голос
/ 03 ноября 2016

Попробуйте invisible_captcha (поддерживает Rails 3, 4 и 5).

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

Базовое использование

В вашей форме:

<%= form_for(@topic) %>
  <%= invisible_captcha %>
  ...
<% end %>

В вашем контроллере:

class TopicsController < ApplicationController
  invisible_captcha only: [:create, :update]
  ...
end
1 голос
/ 18 февраля 2015
HTML - 
<input type="text" name="verifyEmail" id="verifyEmail">

PHP Validation -
if(strlen($_POST['verifyEmail']) > 0){
   header('location: {some redirect URL here..}'); //Send them way away from your form :)
die(); //Stop execution of the script
}

CSS - 
#verifyEmail{
position:fixed; 
visibility: hidden; 
top:-500px; left:-500px;
}

dislplay: none; не показывается боту в HTML (попробуйте его с помощью view source) visibility: hidden; left:-500px; top:-500px; (отображается при просмотре источника)

Я использовал отображение: ни одного медового горшка некоторое время, затем переключился на опцию видимости, когда мне пришло в голову, что поле не отображается в исходном коде. Делайте это с помощью класса или идентификатора в CSS, а не в стиле inline. Уведомлять пользователей с меткой - хорошая идея, а имя не так важно, потому что большинство ботов обычно заполняют все поля.

Определенно, не очень ловко, но очень эффективно, если используется с основной математической капчей.

0 голосов
/ 23 января 2015
<div id="honeypotdiv">
If you see this, leave it blank. Only bots should see this
<input type="text" name="body" value="" />
</div>
0 голосов
/ 18 января 2013

а это мой горшочек с медом:

<input id="email" name="emails" style="border:none"></br>

Если вы все еще параноики, попробуйте еще один подход: Используйте javascript, чтобы очистить поле, как только пользователь по ошибке заполнил значение, и сфокусироваться на следующем текстовом поле. Вы также можете попросить пользователя сделать простую математику, например, ответить: 1 + 2 =?

...