我将在设计注册表单中添加一个蜜罐字段(作为简单的验证码)。检查数据是否已输入此字段的最佳位置在哪里?
如果机器人在此字段中输入了某些内容,则应将其送回索引页面而无需通知。由于我还远未精通 Rails,因此了解它的语法也会有所帮助。
我将在设计注册表单中添加一个蜜罐字段(作为简单的验证码)。检查数据是否已输入此字段的最佳位置在哪里?
如果机器人在此字段中输入了某些内容,则应将其送回索引页面而无需通知。由于我还远未精通 Rails,因此了解它的语法也会有所帮助。
我认为最好的地方是模型,因为仅接受来自“已验证人”的记录可能是一种业务逻辑。
您可以创建一个验证方法来执行此操作:
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
我在通过我的设计注册表格注册的机器人遇到了类似的问题,因此通过执行以下操作解决了这个问题:
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