添加蜜罐字段到Devise注册表单

时间:2012-05-15 10:16:16

标签: forms devise registration honeypot

我会在设计注册表单中添加 honeypot-field (作为简单的验证码)。检查数据是否输入此字段的最佳位置在哪里?

如果机器人已在此字段中输入内容,则应将其发送回索引页面而不通知。由于我还远没有熟练掌握Rails,所以看到这个语法也会很有帮助。

2 个答案:

答案 0 :(得分:2)

我认为这样做的最佳位置是模型,因为接受“经过验证的人类”的记录可能是一种商业逻辑。

您可以创建执行此操作的验证方法:

class Comment < ActiveRecord::Base
  validate :honeypot_absence

  def honeypot_absence
    record.errors.add :invisible_field, "You should not fill the invisible field" unless invisible.field.blank?
  end
end

答案 1 :(得分:0)

机器人通过我的 Devise 注册表进行注册时遇到了类似的问题,因此通过执行以下操作解决了这个问题:

  1. 向视图添加了一个简单的蜜罐输入。 (您需要先生成视图,然后才能执行此操作 - rails generate devise:views
# app/views/devise/registrations/new.html.erb

<div class="form__honeypot">
  If you see this, leave it blank. Only bots should see this
  <input type="text" name="body" value="" />
</div>
  1. 使用 CSS 隐藏字段。
.form {
  position: relative;

  &__honeypot {
    position: absolute;
    visibility: hidden;
    left: -5000px;
    top: -5000px;
  }
}
  1. 生成设计控制器,以便您可以使用 create 方法。

rails g devise:controllers users -c=registrations

您可以使用 -c 标志生成全部或仅生成您需要的一个。

  1. 在新生成的控制器中,添加以下代码:
# app/controllers/users/registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]

  def create
    if params[:body].present?
      return redirect_to root_path
    end
    super
  end

  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:body])
  end
end

本质上,这会将填充表单隐藏字段的任何人(希望是机器人)重定向回 root_url

  1. 最后在 routes.rb 中添加了一行让 Devise 知道使用我们生成的控制器来处理 registrations
# config/routes.rb

Rails.application.routes.draw do
  devise_for :users, controllers: { registrations: 'users/registrations' }
end