112

自動生成された入力を防ぐのに十分なスパム対策メカニズムを考え出そうとしています。キャプチャ、1 + 1 =のようなテクニックを読んだことがありますか?ものはうまく機能しますが、アプリケーションの無料の迅速な使用を妨げる余分なステップも提示します(私はそのようなものを探していません)。

すべてのフォームにいくつかの非表示フィールドを設定しようとしましたが、display: none; そのフォームフィールドIDをトレースし、単純に入力しないようにスクリプトを構成できると確信しています。

優れた自動フォーム入力ロボット対策を実装/知っていますか?HTMLおよび/またはサーバー側の処理でシームレスに実行でき、(ほぼ)防弾になるものはありますか?(JSがなければ、単に無効にすることができます)。

私はこれをセッションに依存しないようにしています(つまり、過負荷を防ぐためにボタンがクリックされた回数を数えています)。

4

28 に答える 28

77

実際、単純なハニーポットフィールドがうまく機能することがわかりました。ほとんどのボットは、必要なフィールドバリデーターを回避することを期待して、表示されるすべてのフォームフィールドに入力します。

http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx

テキストボックスを作成し、JavaScriptで非表示にしてから、サーバー上で値が空白であることを確認します。これにより、99%のロボットが排除され、99%のユーザーがフラストレーションを感じることはありません。javascriptが無効になっている残りの1%には引き続きテキストボックスが表示されますが、そのような場合は「このフィールドを空白のままにしてください」などのメッセージを追加できます(気になる場合)。

(また、フィールドでstyle = "display:none"を実行すると、ロボットがそれを確認してフィールドを破棄するのは簡単すぎるため、javascriptアプローチを使用することをお勧めします)。

于 2010-03-05T17:26:54.657 に答える
74

スパム対策を解決するための実装は簡単ですが、絶対確実ではない(特に「特定の」攻撃の場合)方法は、フォーム送信からページ読み込みまでの時間を追跡することです。

ボットはページをリクエストし、ページを解析してフォームを送信します。これは速いです。

人間はURLを入力し、ページをロードし、ページが完全にロードされるまで待ち、下にスクロールし、コンテンツを読み、フォームにコメント/入力するかどうかを決定し、フォームに入力するのに時間がかかり、送信します。

時間の違いは微妙な場合があります。また、Cookieを使用せずに今回を追跡する方法には、サーバー側のデータベースが必要です。これはパフォーマンスに影響を与える可能性があります。
また、しきい値時間を微調整する必要があります。

于 2010-03-05T15:10:22.213 に答える
25

ボットがまったく見つからない場合はどうformなりますか?

3つの例:

  1. AJAXを使用してフォームを挿入します
  • JSが無効になっていて、フォームを表示/送信できないユーザーに問題がない場合は、ユーザーに通知し、最初にnoscriptステートメントを使用してJavascriptを有効にすることができます。
<noscript>
  <p class="error">
    ERROR: The form could not be loaded. Please enable JavaScript in your browser to fully enjoy our services.
  </p>
</noscript>
  • を作成し、要素の中にform.html配置します。form<div id="formContainer">

  • そのフォームを呼び出す必要があるページ内で、空の<div id="dynamicForm"></div>jQueryを使用します。$("#dynamicForm").load("form.html #formContainer");

  1. 完全にJSを使用してフォームを作成する

// THE FORM
var $form = $("<form/>", {
  appendTo : $("#formContainer"),
  class    : "myForm",
  submit   : AJAXSubmitForm
});

// EMAIL INPUT
$("<input/>",{
  name        : "Email", // Needed for serialization
  placeholder : "Your Email",
  appendTo    : $form,
  on          : {        // Yes, the jQuery's on() Method 
    input : function() {
      console.log( this.value );
    }
  }
});

// MESSAGE TEXTAREA
$("<textarea/>",{
  name        : "Message", // Needed for serialization
  placeholder : "Your message",
  appendTo    : $form
});

// SUBMIT BUTTON
$("<input/>",{
  type        : "submit",
  value       : "Send",
  name        : "submit",
  appendTo    : $form
});

function AJAXSubmitForm(event) {
  event.preventDefault(); // Prevent Default Form Submission
  // do AJAX instead:
  var serializedData = $(this).serialize();
  alert( serializedData );
  $.ajax({
    url: '/mail.php',
    type: "POST",
    data: serializedData,
    success: function (data) {
      // log the data sent back from PHP
      console.log( data );
    }
  });
}
.myForm input,
.myForm textarea{
  font: 14px/1 sans-serif;
  box-sizing: border-box;
  display:block;
  width:100%;
  padding: 8px;
  margin-bottom:12px;
}
.myForm textarea{
  resize: vertical;
  min-height: 120px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="formContainer"></div>

  1. ボットベイト入力
  • ボットは、次のような生意気な入力要素が好きです(本当に好きです) 。
<input 
  type="text"
  name="email"
  id="email"
  placeholder="Your email"
  autocomplete="nope"
  tabindex="-1"
They wll be happy to enter some value such as
`dsaZusil@kddGDHsj.com`
  • 上記のHTMLを使用した後、CSSを使用して入力を表示しないようにすることもできます。
input[name=email]{ /* bait input */
  /* do not use display:none or visibility:hidden
     that will not fool the bot*/
  position:absolute;
  left:-2000px;
}
  • 入力がユーザーに表示されなくなったので、PHPでは、入力は$_POST["email"] (値なし)である必要があります。それ以外の場合は、フォームを送信しないでください。
  • 最後に、あなたがする必要があるのは、実際のユーザーの電子メールアドレスの「ボットベイト」入力の後(!)のような 別の入力を作成することです。<input name="sender" type="text" placeholder="Your email">

謝辞:

Developer.Mozilla-フォームの自動補完をオフにする
StackOverflow-Tabindexを無視する

于 2016-01-06T00:14:48.757 に答える
21

私がしたことは、隠しフィールドを使用してタイムスタンプをそのフィールドに配置し、PHPを使用してサーバー上のタイムスタンプと比較することです。

15秒よりも速かった場合(フォームの大きさによって異なります)、それはボットでした。

この助けを願っています

于 2012-03-10T08:07:09.670 に答える
18

スパムを事実上排除する非常に効果的な方法は、「フォームを送信するためにこのテキストを削除してください!」などのテキストを含むテキストフィールドを用意することです。フォームを送信するには、そのテキストを削除する必要があります。

フォームの検証時に、テキストフィールドに元のテキスト、またはそれに関するランダムなテキストが含まれている場合は、フォームを送信しないでください。ボットはフォーム名を読み取り、[名前]フィールドと[電子メール]フィールドに自動的に入力できますが、送信するために特定のフィールドから実際にテキストを削除する必要があるかどうかはわかりません。

私はこの方法を会社のWebサイトに実装し、日常的に発生するスパムを完全に排除しました。それは実際に動作します!

于 2012-09-19T18:22:42.417 に答える
13

空白のままにする必要がある背景と同じ色のテキストフィールド入力ボックスを作成するのはどうですか。これにより、表示を読み取るボットの問題を回避できます:none

于 2012-03-15T23:19:50.147 に答える
9

http://recaptcha.net/

reCAPTCHAは、書籍のデジタル化を支援する無料のアンチボットサービスです

これはGoogleによって取得されました(2009年):

も参照してください

于 2010-03-05T14:47:54.397 に答える
7

これらのスパムボットの多くは、Webをうろつくサーバーサイドスクリプトにすぎません。JavaScriptを使用して、送信前にフォームリクエストを操作する(つまり、クライアント変数に基づいて追加のフィールドを設定する)ことで、それらの多くと戦うことができます。これは完全な解決策ではなく、多くの問題(たとえば、JavaScriptを使用しないユーザー、モバイルデバイス上など)につながる可能性がありますが、攻撃計画の一部になる可能性があります。

これは簡単な例です...

<script>
function checkForm()
{
    // When a user submits the form, the secretField's value is changed
    $('input[name=secretField]').val('goodValueEqualsGoodClient');

    return true;
}
</script>

<form id="cheese" onsubmit="checkForm">
<input type="text" name="burger">

<!-- Check that this value isn't the default value in your php script -->
<input type="hidden" name="secretField" value="badValueEqualsBadClient">

<input type="submit">
</form>

PHPスクリプトのどこか...

<?php

if ($_REQUEST['secretField'] != 'goodValueEqualsGoodClient')
{
    die('you are a bad client, go away pls.');
}

?>

また、キャプチャは優れており、スパムに対する最善の防御策です。

于 2010-03-05T14:52:05.907 に答える
5

この方法についてまだ誰も言及していないことに驚いています。

  • ページに、小さな非表示の画像を含めます。
  • この画像を提供するときにCookieを配置します。
  • フォームの送信を処理するときは、Cookieを確認してください。


長所:

  • ユーザーと開発者にとって便利
  • 信頼できるようです
  • JavaScriptなし

短所:

  • 1つのHTTPリクエストを追加します
  • クライアントでCookieを有効にする必要があります


たとえば、このメソッドは、WordPressプラグインのCookiesforCommentsで使用されます。

于 2015-02-16T00:41:17.833 に答える
5

何でもエミュレートできるヘッドレスブラウザ(phantomjsなど)の出現により、次のことを想定することはできません。

  • スパムボットはjavascriptを使用しません。
  • マウスイベントを追跡してボットを検出できます。
  • フィールドが視覚的に隠されていることはわかりませんが、
  • 彼らは提出する前に与えられた時間待つことはありません。

それが以前は真実だった場合、それはもはや真実ではありません。

ユーザーフレンドリーなソリューションが必要ない場合は、美しい「私はスパマーです」送信ボタンを提供してください。

 <input type="submit" name="ignore" value="I am a spammer!" />
 <input type="image" name="accept" value="submit.png" alt="I am not a spammer" />

もちろん、2つの画像input[type=image]ボタンで遊ぶことができ、各読み込み後に順序、代替テキスト、画像のコンテンツ(およびそれらのサイズ)、またはnameボタンのを変更できます。サーバーの作業が必要になります。

 <input type="image" name="random125454548" value="random125454548.png"
      alt="I perfectly understand that clicking on this link will send the
      e-mail to the expected person" />
 <input type="image" name="random125452548" value="random125452548.png"
      alt="I really want to cancel the submission of this form" />

アクセシビリティの理由から、正しいテキストの代替を配置する必要がありますが、スクリーンリーダーのユーザーにとっては、ボットと見なされるよりも長い文の方が適していると思います。

追記:これらの例は、英語(または任意の言語)を理解し、簡単な選択をしなければならないことは、10秒待つ、CSSまたはjavascriptを処理する、フィールドが非表示になっていることを知っている、マウスの動きをエミュレートする、またはキーボード入力のエミュレート、..。

于 2016-04-06T15:38:25.543 に答える
3

非常に簡単な方法は、のようないくつかのフィールドを提供<textarea style="display:none;" name="input"></textarea>し、これが入力されているすべての返信を破棄することです。

もう1つのアプローチは、Javascriptを使用してフォーム全体(またはフィールド名のみ)を生成することです。実行できるボットはほとんどありません。

とにかく、投稿されたリンク1つにつき0.03ドルが支払われる、台湾やインドのライブ「ボット」に対しては、それほど多くのことをすることはありません。

于 2010-03-05T15:20:11.040 に答える
2

スパマーを阻止するための簡単なアプローチがあります。これは、少なくとも私の経験では100%効果的であり、reCAPTCHAや同様のアプローチの使用を回避します。このアプローチを実装すると、過去5年間、サイトのhtmlフォームの1つで1日あたり100件近くのスパムからゼロになりました。

これは、ほとんどのhtmlフォーム処理スクリプト(私はFormMail.plを使用)の電子メールALIAS機能と、最も単純なグラフィックプログラムで簡単に作成できるグラフィック送信「コード」を利用することで機能します。そのようなグラフィックの1つに、コードM19P17nHと「左側のコードを入力してください」というプロンプトが含​​まれています。

この特定の例では、文字と数字のランダムなシーケンスを使用していますが、私は訪問者に馴染みのある英語以外のバージョンの単語を使用する傾向があります(「pnofrtay」など)。フォームフィールドのプロンプトは、フォームに表示されるのではなく、グラフィックに組み込まれていることに注意してください。したがって、ロボットにとって、そのフォームフィールドはその目的に関する手がかりを提示しません。

ここでの唯一の本当のトリックは、フォームhtmlがこのコードを「recipient」変数に割り当てることを確認することです。次に、メールプログラムで、使用するそのような各コードが、使用する電子メールアドレスを指す電子メールエイリアスとして設定されていることを確認します。ロボットが読み取るためのフォームにはいかなる種類のプロンプトも電子メールアドレスもないため、空白のフォームフィールドに何を入力すればよいかわかりません。フォームフィールドまたは受け入れ可能なコード以外に何も入力しない場合、フォームの送信は「不正な受信者」エラーで失敗します。私の経験では実際には必要ありませんが、さまざまなフォームでさまざまなグラフィックを使用できます。

もちろん、人間は、reCAPTCHAや同様の、よりエレガントなスキームに関連するすべての問題なしに、この問題を一瞬で解決できます。人間のスパマーが受信者の障害に応答し、ロボットに画像コードをプログラムする場合、ロボットが応答するようにハードコードされていることに気づいたら、簡単に変更できます。このアプローチを使用してから5年間、使用しているフォームからスパムを受け取ったことはなく、フォームの人間のユーザーから苦情を受けたこともありません。これはロボットのOCR機能で打ち負かされる可能性があると確信していますが、htmlフォームを使用する私のサイトではこれが発生したことはありません。また、「スパムトラップ」(スパム対策ポリシーを指す非表示の「comehither」htmlコード)を効果的に使用しましたが、効果は約90%にすぎませんでした。

于 2013-08-01T19:02:31.490 に答える
1

多くのWebサイトのようにランダムな文字や数字を作成する代わりに、認識可能なオブジェクトのランダムな画像を作成することもできます。次に、画像内の何かが何色であるか、またはオブジェクト自体が何であるかを入力するようにユーザーに依頼します。

全体として、すべてのソリューションには長所と短所があります。ユーザーがスパム対策メカニズムを通過するには難しすぎることと、通過できるスパムボットの数との間の幸せな中央値を見つける必要があります。

于 2010-03-05T14:53:54.560 に答える
1

私はここで多くのことを考えています:

  1. JSを使用して(必要ではありませんが)、マウスの移動、キーの押下、マウスのクリックを追跡します
  2. リファラーURLを取得する(この場合は同じドメインからのものである必要があります)...通常のユーザーは、連絡フォームに到達する前にWebサイトをナビゲートする必要があります。PHP:リファラーURLを取得する方法は?
  3. $ _SESSION変数を使用してIPを取得し、フォームの送信をそのIPのリストと照合します
  4. 1つのテキストフィールドにダミーテキストを入力します。ダミーテキストは、サーバー側で上書きされているかどうかを確認できます。
  5. ブラウザのバージョンを確認してください:http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ...ボットがブラウザを使用せず、スクリプトのみを使用することは明らかです。
  6. AJAXを使用して、フィールドを1つずつ送信し、送信間の時間差を確認します
  7. 別の入力を送信するためだけに、フォームの前後に偽のページを使用する
于 2015-01-11T12:52:13.223 に答える
0

ロボットはJavaScriptを実行できないため、JavaScriptを使用してページにある種の非表示要素を挿入し、フォームを送信する前にその存在を検出するなどの操作を行いますが、一部のユーザーではJavaScriptも無効になるため注意してください。

そうでなければ、あなたは「人間性」のクライアント証明の形式を使用することを余儀なくされると思います

于 2010-03-05T14:54:08.477 に答える
0

ボットによるスパムを回避するために私が見つけた最善の解決策は、フォームの非常に些細な質問またはフィールドを使用することです。

次のようなフィールドを追加してみてください:

  • 脇のボックスに「こんにちは」をコピーします
  • 1 + 1 =?
  • ボックス内のWebサイト名をコピーします

これらのトリックでは、ユーザーがフォームに入力する必要があるものを理解する必要があるため、大規模なボットフォーム入力のターゲットになるのがはるかに困難になります。

編集

この方法の裏側は、質問で述べたように、ユーザーがフォームを検証するための追加の手順です。しかし、私の意見では、キャプチャよりもはるかに単純であり、フォームに入力するときのオーバーヘッドは5秒以内であり、ユーザーの観点からは許容できるようです。

于 2010-03-05T15:01:00.317 に答える
0

これに関するチュートリアルがJQueryサイトにあります。JQueryですが、アイデアはフレームワークに依存しません。

JavaScriptが利用できない場合は、CAPTCHAタイプのアプローチにフォールバックする必要があるかもしれません。

于 2010-03-05T15:27:30.577 に答える
0

これを行う簡単な方法は、値を含むフィールドを配置し、このフィールドのテキストを削除するようにユーザーに依頼することです。ボットはそれらを埋めるだけなので。フィールドが空でない場合は、ユーザーが人間ではなく、投稿されないことを意味します。キャプチャコードと同じ目的です。

于 2010-05-14T13:27:38.067 に答える
0

その単なるアイデア、idは私のアプリケーションでそれを使用し、うまく機能します

javascriptまたはjqueryを使用してマウスの動きでCookieを作成し、サーバー側でCookieが存在するかどうかを確認できます。これは、人間だけがマウスを持っているため、Cookieはその人だけが作成できるため、Cookieはタイムスタンプまたは検証可能なトークンにすることができます。

于 2014-05-19T11:44:44.160 に答える
0

私の経験では、フォームが単なる「連絡」フォームである場合、特別な措置は必要ありません。スパムはウェブメールサービスによって適切にフィルタリングされます(サーバースクリプトを介してウェブフォームリクエストを追跡し、メールに効果的に到達するものを確認できます。もちろん、優れたウェブメールサービスがあると思います:D)

ところで、私はこれをセッションに依存しないようにしています(たとえば、過負荷を防ぐためにボタンがクリックされた回数を数えるなど)。

それは良くないと思います。確かに、私が達成したいのは、特定のアクションを実行するユーザー(たとえば、「CV」ページを見て適切な連絡先を使用したユーザー)からメールを受信することです。形)。したがって、ユーザーが必要なことを行うと、セッションの追跡を開始してCookieを設定します(常にセッションCookieを設定しますが、セッションを開始しない場合は、ユーザーがセッションを持っていると信じて作成された偽のCookieです)。ユーザーが望まないことをした場合、私は彼のためにセッションを維持することを気にしないので、過負荷などはありません。

また、広告サービスが、ユーザーが「広告を見た」かどうかを確認するために、ある種のapi(おそらくすでに存在する)を提供することは私にとって素晴らしいことです。広告を見ているユーザーは実際のユーザーである可能性がありますが、そうでない場合は少なくとも実際には、とにかく1つのビューを取得するので、損失はありません。(そして私を信じてください、広告コントロールはあなたが一人でできる何よりも洗練されています)

于 2015-01-11T12:24:10.707 に答える
0

使用する:

  1. トークン付きのフォーム
  2. フォームをチェックして、IPアドレスで遅延を形成します
  3. ブロックIP(オプション)
于 2015-01-11T12:32:30.923 に答える
0

実際にはディスプレイ付きの罠:どれも魅力のようには機能しません。CSS宣言をグローバルスタイルシートを含むファイルに移動すると、スパムボットもそれらをロードするように強制されます(直接のstyle = "display:none;"宣言は、スパムボットによって解釈される可能性があります。ドキュメント自体のローカルスタイル宣言)。

これを他の対策と組み合わせると、スパムボットがジャンクをアンロードするのが難しくなるはずです(私はさまざまな手段でゲストブックを保護していますが、これまでのところ、それらは私の主要なトラップに落ちています-しかし、ボットがそれらをバイパスする場合は、他の人はトリガーする準備ができています)。

私が使用しているのは、偽のフォームフィールド(CSSを一般的に処理しない、または表示しないブラウザが使用されている場合は無効なフィールドとも呼ばれます:特になし)、健全性チェック(つまり、入力の形式)の組み合わせです。有効ですか?)、タイムスタンプ(送信が速すぎる場合と遅すぎる場合の両方)、MySQL(電子メールアドレスとIPアドレス、およびフラッドフィルターに基づくブラックリストを実装するため)、DNSBL(SpamhausのSBL + XBLなど)、テキスト分析(たとえば、スパムの強力な兆候である単語)および検証電子メール(提供された電子メールアドレスが有効かどうかを判断するため)。

確認メールに関する注意:この手順は完全にオプションですが、実装する場合、このプロセスはできるだけ使いやすいものにする必要があります(つまり、電子メールに含まれるリンクをクリックするだけです。 )そして、問題の電子メールアドレスを一定期間ホワイトリストに登録して、ユーザーが追加の投稿をしたい場合にその後の検証が回避されるようにします。

于 2016-01-18T16:58:36.427 に答える
0
  1. 非表示のテキストボックスがあるメソッドを使用します。ボットはWebサイトを解析するため、おそらくWebサイトを埋めます。それから私はそれが空であるかどうかをチェックします。それがウェブサイトでない場合は戻ってきます。

  2. メール確認を追加します。ユーザーは電子メールを受信し、リンクをクリックする必要があります。それ以外の場合は、しばらくして投稿を破棄してください。

于 2016-02-20T19:35:35.880 に答える
0

フォームにタイムチェックを追加しました。3秒以内に記入するとフォームは送信されません。これは、特に長いフォームの場合に非常に効果的でした。これが私が送信ボタンで呼び出すフォームチェック機能です

function formCheck(){
var timeStart; 
var timediff;

$("input").bind('click keyup', function () {
    timeStart = new Date().getTime();          
}); 
 timediff= Math.round((new Date().getTime() - timeStart)/1000);

  if(timediff < 3) { 
    //throw a warning or don't submit the form 
  } 
  else submit(); // some submit function

}
于 2016-09-09T21:24:26.657 に答える
0

Javascriptの検証後に正しいアクション属性を追加することで、スパムロボットをだますことができます。ロボットがJavascriptをブロックすると、フォームを正しく送信できなくなります。

HTML

<form id="form01" action="false-action.php">
    //your inputs
    <button>SUBMIT</button>
</form>

JAVASCRIPT

$('#form01 button').click(function(){

   //your Validations and if everything is ok: 

    $('#form01').attr('action', 'correct-action.php').on("load",function(){
        document.getElementById('form01').submit()
    });
})

次に、エラーを防ぐために.attr()の後に「コールバック」を追加します。

于 2017-02-14T12:13:25.093 に答える
0

ますます洗練されたスパムボットや自動ブラウザなどの技術により、スパムの発信元を特定することが難しくなります。しかし、ソフトウェア、人間、またはその両方によって投稿されたかどうかにかかわらず、スパムはその内容のためにスパムです。最善の解決策は、投稿されたコンテンツをCleantalkやAkismetなどのスパム対策APIを介して実行することだと思います。それは比較的安価で効果的であり、ユーザーを煩わせることはありません。APIにアクセスする前に、フォームの送信時間やその他の従来のチェックで、それほど洗練されていないボットをチェックできます。

于 2017-12-12T01:57:07.593 に答える
0

申し訳ありませんが、別の回答を追加することにしました。

2つの組み合わせを使用します。

  1. (他の回答ですでに言及されている)ハニーポットフィールドはname="email"、画面から移動するなど、洗練された方法で非表示にするようにしてください。ボットは検出できるためdisplay:none
  2. clicksユーザーが必須フィールド(他の回答では言及されていない)でユーザーが(またはfocusesTABフレンドリーになりたい場合) JavaScriptによって設定される非表示フィールド

2番目のオプションは、JavaScriptボットでさえ実際にテキストボックスをクリックすることを気にしないため、ヘッドレスブラウザタイプのスパム(phatnom.jsまたはSeleniumを使用)から保護することもできます。

ボットの99%をブロックします。

PS。LastPassや1Passworなどのパスワードマネージャーによって入力されていないフィールドにのみフォーカストリックを使用するようにしてください。

同じ理由で-ハニーポットにマークを付けますautocomplete="false" tabindex="-1"

于 2020-11-24T15:41:30.733 に答える
-1

ちょうど私の5セントの価値。これの目的がかなり良い音のロボットの99%を停止することであり、ロボットの99%がJavaスクリプトを実行できない場合、すべてを打ち負かす最善の解決策は、送信するアクションを持つフォームを使用しないことです。投稿URL。

フォームがjava-scriptを介して制御され、java-scriptがフォームデータを収集してからHTTPリクエストを介して送信する場合、ロボットはフォームを送信できません。送信ボタンはJavaスクリプトを使用して、フォームを送信するコードを実行するためです。

于 2016-07-14T12:00:12.090 に答える