我会在设计注册表单中添加 honeypot-field (作为简单的验证码)。检查数据是否输入此字段的最佳位置在哪里?
如果机器人已在此字段中输入内容,则应将其发送回索引页面而不通知。由于我还远没有熟练掌握Rails,所以看到这个语法也会很有帮助。
答案 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 注册表进行注册时遇到了类似的问题,因此通过执行以下操作解决了这个问题:
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>
.form {
position: relative;
&__honeypot {
position: absolute;
visibility: hidden;
left: -5000px;
top: -5000px;
}
}
create
方法。rails g devise:controllers users -c=registrations
您可以使用 -c
标志生成全部或仅生成您需要的一个。
# 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
routes.rb
中添加了一行让 Devise 知道使用我们生成的控制器来处理 registrations
。# config/routes.rb
Rails.application.routes.draw do
devise_for :users, controllers: { registrations: 'users/registrations' }
end