フォームにハニーポットフィールドを追加するにはどうすればよいですか?
-
28-10-2019 - |
質問
ボット/スパムと戦うために、フォームにハニーポットフィールドを追加することについて読んでいます。唯一の問題は、彼らのガイドやどこから始めればいいのかということです。多くのサイトでは、スパムボットだけが記入することを隠したフィールドを作成すると言います。しかし、私はこれに慣れていないので、アプリケーションのどこから始められるかわからない。誰かがこれをセットアップする方法についてアドバイスをくれますか? Devise登録ページにHoney Pot Fieldsを使用させようとしています。
解決
Honeypot Captchasの背後にある基本的なアイデアは、(フィールド名を読むだけでボットに)「フォーム」または「電子メール」または「コンテンツ」という名前の(CSS経由)フィールドを(フィールド名を読むだけで)、埋めるべきであるように見えるということです。次に、サーバーが提出物を見ると、これらの隠しフィールドが空白であることを確認します。そうでない場合は、投稿にボットとしてフラグを立てます。
よく説明されている例があります (ASPのいくつかのコード付き)、および これがハニーポットのキャプチャを提供するRailsの宝石です。
それか Rails Gem リンクして、インストールしたら非常に使いやすいように見えます。
<% form_tag comments_path, :honeypot => true do -%>
...
<% end -%>
ただし、アプローチを実装するだけでなく、アプローチについて学ぶことに興味がある場合は、自分でロールすることをお勧めします。自分で転がしている場合は、フィールドがCSS(または他のスタイル/ポジショニングトリック)によって隠されていることを確認することが重要です input type="hidden"
- それ以外の場合は、ボットがフィールドに記入しない場合があります。
Michael Miorがコメントで指摘したように、ユーザーに空白のままにするようにユーザーに伝える隠されたフィールドの隣にメッセージを持っていることが重要です - そうでなければ、スクリーンリーダーを持つユーザーは誤ってそれを記入するかもしれません。したがって、アクセス可能なWebサイトを作成している場合(ほぼ間違いなくそうあるべきです)、それを変更するか、自分で転がす必要があるかもしれません。
このトリックは絶対確実ではないことを覚えておいてください - ボットがページをレンダリングし、どのフィールドがユーザーに塗りつぶされるかを決定するのを止めるものは何もありません - しかし、そのようなボットは見ただけのボットよりもかなり複雑ですフォームHTMLで。ハニーポットのキャプチャは、単純なボットを止めるのに非常に効果的である可能性があります。
他のヒント
HTML -
<input type="text" name="verifyEmail" id="verifyEmail">
PHP Validation -
if(strlen($_POST['verifyEmail']) > 0){
header('location: {some redirect URL here..}'); //Send them way away from your form :)
die(); //Stop execution of the script
}
CSS -
#verifyEmail{
position:fixed;
visibility: hidden;
top:-500px; left:-500px;
}
dislplay: none;
HTMLのボットに表示されません(ビューソースで試してみてください)visibility: hidden; left:-500px; top:-500px;
(ソースを表示するときに表示)
ディスプレイを使用しました。しばらく蜂蜜ポットなし、その後、フィールドがソースコードに表示されなかったことが発生したときに可視性オプションに切り替えました。インラインスタイルではなく、CSSのクラスまたはIDでそれを行います。ラベル付きのユーザーに通知することは良い考えであり、ほとんどのボットが一般にすべてのフィールドを埋めるため、名前はそれほど重要ではありません。
基本的な数学のcaptchaで使用すると、すべてがキャッチではありませんが、非常に効果的です。
試す Invisible_captcha (Rails 3、4、および5をサポートします)。
シンプルで柔軟なアプローチを備えた、小規模および中程度の(トラフィックの点で)サイトで非常にうまく機能します。また、時間に敏感な提出物も提供します。
基本的な使用法
あなたの形で:
<%= form_for(@topic) %>
<%= invisible_captcha %>
...
<% end %>
コントローラーで:
class TopicsController < ApplicationController
invisible_captcha only: [:create, :update]
...
end
<div id="honeypotdiv">
If you see this, leave it blank. Only bots should see this
<input type="text" name="body" value="" />
</div>
そして、これは私のハニーポットです:
<input id="email" name="emails" style="border:none"></br>
まだこれに妄想している場合は、もう少しアプローチを試してください。ユーザーが誤って値に記入して次のテキストボックスに集中したら、JavaScriptを使用してフィールドをクリアします。また、ユーザーに回答のような単純な数学を行うように依頼することもできます:1+2 =?