ハニーポット フィールドをデバイス登録フォームに (単純なキャプチャとして)追加します。このフィールドにデータが入力されているかどうかを確認するのに最適な場所はどこですか?
ボットがこのフィールドに何かを入力した場合、ボットは通知なしでインデックス ページに戻されます。私はまだ 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
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