web-dev-qa-db-ja.com

ロボットがフォームに自動的に入力するのを防ぐ方法は?

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

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

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

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

100
Gal

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

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

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

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

71
Pindatjuh

私は実際、シンプルなハニーポット畑がうまくいくことを発見しました。ほとんどのボットはeveryフォームフィールドに入力し、必要なフィールドバリデーターを回避したいと考えています。

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

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

(また、フィールドでstyle = "display:none"を行うと、ロボットがそれを見てフィールドを破棄するのは簡単すぎるため、私が好む理由ですjavascriptアプローチ)。

71
Ben Scheirman

If-ボットがformをまったく見つけられない場合

3つの例:

1. AJAXを使用してフォームを挿入します

ユーザーがJSを無効にしてフォームを表示/送信できない場合は... <noscript><p class="error">ERROR: The form could not be loaded. Please, re-enable JavaScript in your browser to fully enjoy our services.</p></noscript>を使用していつでも通知できます。より、

  1. form.htmlを作成し、form<div id="formContainer">要素内に配置します。
  2. そのフォームを呼び出す必要があるページ内では、空の<div id="dynamicForm"></div>とこのjQueryを使用します。
$("#dynamicForm").load("form.html #formContainer");

2. 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>

3. ボットベイト入力

ボットは(really like)saucyのような入力要素:

<input
  type="text"
  name="email"
  id="email"
  placeholder="Your email"
  autocomplete="nope"
  tabindex="-1" />

彼らは[email protected]のように値を入力して喜んでいるでしょう

(上記のHTMLを使用した後)よりも、CSSを使用すると次のようになります。

input[name=email]{ /* bait input */
    /*
         don't use display:none or visibility:hidden
         cause that will not fool the bot
    */
    position:absolute;
    left:-2000px;
}

入力がユーザーに表示されなくなったので、PHP $_POST["email"]が空(値なし)であることを期待してください!それ以外の場合は、フォームを送信しないでください。

ここで、oyuがする必要があるのは、別の入力のような<input name="sender" type="text" placeholder="Your email"> after(!)"bot -bait "実際のユーザーのメールアドレスの入力。)

謝辞:

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

20
Roko C. Buljan

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

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

この助けを願っています

18
adnhack

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

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

私はこの方法を企業のWebサイトに実装しました。これにより、私たちが毎日受け取っていたスパムを完全に排除しました。それは実際に動作します!

15
HawleyTronics

空白のままにしておく必要のある背景と同じ色のテキストフィールド入力ボックスを作成してください。これにより、ディスプレイを読み取るボットの問題を回避できます:なし

11
Steve

http://recaptcha.net/

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

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

こちらもご覧ください

8
Anantha Kumaran

これらのスパムボットの多くは、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.');
}

?>

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

6
John Himmelman

私は誰もまだこの方法に言及していないことに驚いています:

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


長所:

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

短所:

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


たとえば、このメソッドはWordPress plugin Cookies for Comments によって使用されます。

4
Gras Double

あらゆるものをエミュレートできるヘッドレスブラウザ(phantomjsなど)の登場により、できませんと仮定します。

  • スパムボットはJavaScriptを使用しません。
  • マウスイベントを追跡してボットを検出できます。
  • フィールドが視覚的に隠されていることはわかりませんが、
  • 送信する前に一定の時間待機することはありません。

以前はtrueだった場合、trueではなくなりました。

ユーザーフレンドリーな解決策を望まない場合は、美しい "私はスパマーです"送信ボタン

 <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" />

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

3
Adam

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

別のアプローチは、JavaScriptを使用してフォーム全体(またはフィールド名のみ)を生成することです。少数のボットで実行できます。

とにかく、投稿されたリンク1つにつき$ 0.03が支払われ、その方法で生計を立てている台湾またはインドのライブ「ボット」に対しては、あまり何もしません。

2
SF.

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

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

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

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

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

2
user2643367

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

  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. 別の入力を送信するためだけに、フォームの前後に偽のページを使用します
1
valicu2000

フォームにタイムチェックを追加しました。 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

}
0
Harika Y

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

0
nmit026

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

0
matthew

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

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

0
h0mayun

実際には、display:noneのトラップはチャームのように機能します。 CSS宣言をグローバルスタイルシートを含むファイルに移動すると、スパムボットがそれらを強制的にロードするのに役立ちます(直接style = "display:none;"宣言は、文書内のローカルスタイルの宣言と同様に、スパムボット)。

これと他の対策を組み合わせることで、スパムボットが迷惑メールをアンロードできないようにする必要があります(ゲストブックはさまざまな手段で保護されていますが、これまでのところプライマリトラップに陥っていますが、ボットはそれらをバイパスする必要があります)他の人はトリガーする準備ができています)。

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

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

0
Robidu

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

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

0
Brian

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

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

0
Nick Allen

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

JavaScriptを使用できない場合は、CAPTCHAタイプのアプローチにフォールバックする必要がある場合があります。

0
Pool
  1. 非表示のテキストボックスがあるメソッドを使用します。ボットはWebサイトを解析するため、おそらくそれを埋めます。次に、ウェブサイトが戻っていない場合は空であるかどうかを確認します。

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

0
cookie

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

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

私はそれが良いとは思わない、確かに私が達成したいのは、私が興味を持っているユーザーであるため、特定のアクションを行うユーザーからメールを受信することです(たとえば、「CV」ページを見て適切な連絡先を使用したユーザー形)。そのため、ユーザーが目的の操作を行うと、セッションの追跡を開始してCookieを設定します(常にセッションCookieを設定しますが、セッションを開始しない場合は、ユーザーがセッションを持っていると信じるために作成された偽のCookieです)。ユーザーが不要な操作を行った場合、ユーザーのセッションを維持する必要がないため、オーバーロードなどは発生しません。

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

0
GameDeveloper

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

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

  • ボックスの横にある「hello」をコピーします
  • 1 + 1 =?
  • ボックスにウェブサイト名をコピーします

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

[〜#〜] edit [〜#〜]

このメソッドの裏側は、質問で述べたように、ユーザーがフォームを検証するための追加のステップです。しかし、私の意見では、キャプチャよりもはるかに単純であり、フォームに入力する際のオーバーヘッドは5秒以下であり、ユーザーの観点からは許容範囲内に収まるようです。

0
Thibault Falise

使用1)トークンを含むフォーム2)フォームをチェックしてIPアドレスとの遅延を形成する3)ブロックIP(オプション)

0
Vivian

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()の後に「コールバック」を追加します

0
Santi Nunez