0

我将在设计注册表单中添加一个蜜罐字段(作为简单的验证码)。检查数据是否已输入此字段的最佳位置在哪里?

如果机器人在此字段中输入了某些内容,则应将其送回索引页面而无需通知。由于我还远未精通 Rails,因此了解它的语法也会有所帮助。

4

2 回答 2

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
于 2012-05-15T14:07:41.107 回答
0

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

  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
于 2021-01-19T07:31:20.330 回答