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

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. メソッドを利用できるように、Devise コントローラーを生成します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 に答える