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


105

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

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

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

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


5
captchaソリューションを望まないことに感謝します!IMO、フォームスパムはサイト所有者にとって問題であり、それを防ぐことはユーザーが負担する必要のある負担ではありません。ここでの返信からも明らかなように、サイト側でスパムに対処する方法は多すぎます。ユーザーとの対話を必要とするメソッドは、怠惰または初心者のみが使用する必要があります。
Mike

回答:


73

アンチスパムを解決するための実装は簡単であるが、完全ではない(特に「特定の」攻撃について)方法は、フォームの送信とページの読み込みの間の時間を追跡することです。

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

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

時間の違いは微妙です。そして、クッキーなしでこの時間を追跡する方法は、サーバー側データベースのいくつかの方法を必要とします。これはパフォーマンスに影響を与える可能性があります。
また、しきい値時間を微調整する必要があります。


9
エンドユーザーがaddons.mozilla.org/en-US/firefox/addon/1882のような自動フォームフィラーを使用して、非常に高速な送信ができるようにする場合は注意してください。キャプチャと同様に、最終的なユーザーを困らせることは一般的には良くありません。特に、急いでいる人が(非常に)速く進むのを妨げている場合はなおさらです。
スノーフレーク2010年

1
良い点ですが、すべてコンテキストに依存します。フォームがログインフォームの場合は、完全に同意します。しかし、なぜボットからのログインを無効にするのですか?コンテキストがStackOverflowのこのようなコメントボックスである場合、私は確かに知っています。コメントボックスで自動入力を使用する場合、あなたはスパマーです。署名に自動入力を使用する場合でも、実際にコンテンツを入力するには時間がかかることに注意してください。
Pindatjuh 2010年

5
SOはこのようなことを行うことに注意してください。コメントを編集して、断続的に、または続けて何度も繰り返すと、「人間ですか?」というメッセージが表示されます。ページ。
Jakob Borg、

2
ハッカーは常にフォームを要求するわけではありません。場合によっては、(GETまたはPOSTを使用して)入念に作成されたURLで、少ない労力でフォームを複数回投稿するのに十分な場合があります。
製作者2013

1
captchaでこれを実装します。フォームの送信が速すぎる場合は、キャプチャを提示して、正規のユーザーが通過できるようにします。
Yashovardhan99 2017

75

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

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

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

(また、フィールドでstyle = "display:none"を実行すると、ロボットがそれを見てフィールドを破棄するのが非常に簡単になることに注意してください。そのため、私はJavaScriptのアプローチを好みます。


1
ボットが実際にcssファイルを通過し、それがdisplay:noneであると考えていると思いますか??JSベースのソリューションは簡単に無効にできるため、実際には使用しません。
Gal

1
それは彼らのウェブランキングを後押しするためにたくさんの非関連キーワードを含むウェブマスターのための古い解決策のようです。Googleなどの検索クローラーボットは、display:noneと理解できると思います。他のボットがそれを行うことができないのはなぜですか?
スノーフレーク

2
私は今、この手法を使い始めた2つのサイトで使用しており、ボットのサインアップは両方でゼロ0になっています。標的型攻撃には役立ちませんが、ほとんどはエクスプロイトまたはスパムを探しています。
nirvdrum 2011

25
ここでは、小さなポイント:あなたのハニーポットの入力を配置するJSの問題、ちょうど使用CSSを回避するために、上記ページのトップ- JSが無効になっていてもいいでしょうし、それを回避ボットを取得するには、この方法では、解析CSSのことができるようにする必要がありますハニーポットかどうかについて、絶対的な位置付けと常識的な決定を行います。この方法でもう少し防弾:)
totallyNotLizards '26 / 10/26

3
@ alexy13はい、もっとシンプルですが、回答で述べたように、ボットが1つのCSSプロパティをテストするだけで、何をしようとしているのかを簡単に理解できます。ただし、絶対配置戦略を使用する場合、ボットはすべての配置ルール要素のほとんどの親のルールを解析して、入力が表示されるかどうかを判断し、次にまたはその情報に基づいて行動しない-これは、ほとんどの(すべてではないにしても)ボットにとって価値があるよりもずっと面倒です。
totallyNotLizards 2013年

22

ボットがまったく見つからない場合はどう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を無視する


7
正当なユーザーのブラウザは、おとり入力フィールドを電子メールフィールドとして認識し、ユーザーがフォームの残りの部分を自動入力することを選択したときに、自動入力する可能性がありますか?ユーザーは、画面から離れたフィールドがいっぱいになっているのを見ることはなく、ボットのように見えます。
wilbbe01 2016

私は疑いautocomplete=nopeをデフォルトとなりon;-) MDN:入力#attrの-オートコンプリート
ハンドル

@handleそれは重要ではありません、それはボットの餌の入力です。あなたはautocomplete="oh sunny day"そのことについて書くことができます。
ロコC.ブルジャン

19

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

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

この助けを願っています


1
ただし、高速/パワーユーザーを許可するために、制限を約3〜5秒に設定するとよいでしょう。これと同じアプローチを使用し、フォームの制限を3秒に設定すると、ボットの99%が除外されました。
Kayla 14

@adnhack次のような意味ですか?1)phpを使用してページをロードすると、サーバー時間を取得してセッションを作成します。2)ユーザーまたはボットがフォームに入力し、[送信]をクリックして、$.postすべてを外部のphpファイルに送信します。3)外部phpで再びサーバー時間を取得し、セッション時間と比較しますか?
Andris

16

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

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

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


興味深いことに、それが他の回答よりも効果的であるかどうかを知っていますか...非表示のテキストボックス、またはフォームの入力にかかる時間を追跡していますか?
オースティンヘンリー2012

4
これは、方向性をたどることができないユーザーもキャッチしますが、これは望ましくない場合があります。
wilbbe01 2016

私はこれが好き!:ボットは、異なる素材の組み合わせや塗りつぶされたフィールド...テストするための最良の方法は、これらのいずれかで、このスキャンを実施しているしようとし始めるまでsectoolmarket.com/...
nmit026

ボットを管理している人がコードを見つけて調整しない限り、効果的です。
Talha Awan

11

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


2
回答の代わりに評判が高まったら、コメントとしてこれを追加してください;)
Rob

3
これにより、アクセシビリティの問題が発生します。ハニーポットインデックスは、スクリーンリーダーを使用するユーザーから非表示になりません。
Otterfan 2014

5
私は視覚障害者ですが、このようなフォームフィールドを1回見つけました。その上のラベルには、「これが表示されている場合は、空白のままにしてください」と書かれています。非常に効果的なIMO。
Parham Doustdar 2016年

8

http://recaptcha.net/

reCAPTCHAは、書籍のデジタル化に役立つ無料のアンチボットサービスです。

Googleに買収されました(2009年):

また見なさい


5
ユーザーとして、私はrecaptchaを何度も理解するのが難しいと感じています。一部の単語は非常に読みにくいため、3〜4回試さなければなりません。これは間違いなくロボットの問題に役立ちますが。
ブライアン

何ブライアンは言ったと:yro.slashdot.org/story/10/03/02/0135238/...
SF。

CAPTCHA / reCAPTCHAは現在ボットフォームの送信を停止していないため、このページに移動しました。これは5年後のことであり、この答えが出されたときよりも新しいテクニックです
JohnnyFaldo

この回答にこれ以上の賛成票がない理由に私は驚いています。ユーザーが好むと好まざるとにかかわらず、これは優れたソリューションです。特に、登録フォームでのみ使用する場合。
towi_parallelism

最近のreCAPTCHAは単純なチェックボックスとして開始されます。おそらく、以前ほど苦痛ではありませんか?...
rogerdpack 2017

6

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

?>

また、CAPTCHAは素晴らしいものであり、スパムに対する最善の防御策です。


おかげで、どのブラウザでもJavaScriptを簡単に無効にできるため、私の「アンチスパムメカニズム」をなくすことができるので、もっとグローバルなものを探しています。
Gal

私は間違っているかもしれませんが、これはJSが無効になっているすべてのユーザーに「あなたは悪いクライアントです、pls。
ギャル

Gal、その自明な例は、クライアント側のjsによって設定されたリクエストvarに対して検証する方法を示すだけです。
John Himmelman、

@John Himmelman Captchaは解決可能であり、スパムに対する最善の防御とは限りません。低料金でフォームのキャプチャを解決するanti-captcha.comのような有料サービスがあります。

このアプローチの問題は、PhantomJSを使用するボットをたくさん見たことがあることです。これは彼らが通り抜けることを可能にするでしょう。
Parham Doustdar 2016年

4

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

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


長所:

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

短所:

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


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


PhantomJSのようなものを使用するボットはこれを簡単に回避できませんか?
Parham Doustdar 2016年

1
完全なブラウザエンジンであるため、アセットなどが読み込まれます。それでも、おそらくcURLスクリプトよりもはるかに遅いため、スパムボットによく使用されるかどうかはわかりません。
Gras Double

これがCSRFトークンよりも優れている理由は何ですか?
xenoterracide 2017年

1
CSRFトークンはボットをまったく停止しません。最初のリクエスト、トークンを含むフォームを取得します。2番目のリクエストでは、トークンを含めてフォームをPOSTします。
Gras Double

4

何かをエミュレートできるヘッドレスブラウザー(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を処理する、フィールドが非表示であることを認識する、マウスの動きをエミュレートする、またはキーボード入力のエミュレート、...


代替テキストを入力する必要があるという事実自体が、2つの画像ソリューションが他の代替手段と同じくらいスクリプトの影響を受けやすいことを意味しているように思えます。そして、「私はスパマーではありません」ボタンの場合、それもスクリプト化できませんか?
ホークアイ

@Hawkeye 私の答えは、ヘッドレスブラウザーは何でもエミュレートできるということでした。JavaScript 、遅延、マウスの移動、隠しフィールドなど...私の例の前の「美しい」という用語は一種の「皮肉」でした。しかし、これらの例は、英語を理解し、簡単な選択を行う必要があることは、スパムボットにとって10秒待つこと、CSSまたはJavaScriptを処理すること、フィールドが非表示であることを認識すること、マウスの動きをエミュレートすること、またはキーボード入力をエミュレートすること、...
アダム

私は今あなたの要点を理解しています。たぶん最後のステートメント「しかし、これらの例は説明しています...」などを回答に追加します。それが私があなたの意味を理解するのに役立ったからです。最初は「ボットができないとは想定できない」という自己矛盾する議論のように思われましたが、ボットができないとまだ想定できないことをリストアップしました。しかし、あなたのポイントの核心は、あなたの例(どの送信ボタンで選択を行う必要がある)がより難しいということです-これ(今は私が理解している)は素晴らしい答えです。+1
ホークアイ

3

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

別の方法は、JavaScriptを使用してフォーム全体(またはフィールド名のみ)を生成することです。実行できるボットはほとんどありません。

とにかく、投稿されたリンク1つにつき0.03ドルが支払われる台湾やインドからのライブの「ボット」に対しては、それほど大きなことはせず、その方法で生計を立てます。


2
私はこの答えが7年近く前であることを知っていますが、これはコメントする価値があると思います。多くのボットは、このタイプの保護を回避するために、style = "display:none"のフィールドを無視するようにプログラムできます。
ケニージョンソン

JavaScriptを使用して入力を覆い隠す方法、それらの上にダミー要素を表示する方法、表示領域の外に移動する方法、背景やレイアウトの装飾と完全に調和するようにスタイルを設定する方法など、何十もの方法があります。入力名のランダム化(ハッシュ)と(マッピングの維持) hashed => original in session server-side)は、名前をヒントとして使用し、有効な入力を手動でマッピングするのに役立ちます。とにかく、手動のスパムに対する防御策はありません。
SF。

2

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

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

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

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

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


1

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

  1. JSを使用して(必要ではありませんが)、マウスの移動、キーの押下、マウスのクリックを追跡する
  2. 参照URL(この場合は同じドメインの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. フォームの前/後に偽のページを使用して、別の入力を送信する

これらのステップvalicu2000について詳しく説明していただけますか?それらは2020年にまだ有効ですか?ありがとう。
Michael Moriarty

0

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

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


良いアイデア。ただし、色覚異常のユーザーが除外される可能性があるため、色を基準として使用しません
Neil Aitken

はい、良い点です。実際、一般的な画像の問題は、画像にアクセスできないことです。altタグを使用して画像に「アクセス可能」にすることで、ロボットは簡単に画像を理解できます。
ブライアン

画像は常に悪い考えです...テキストはほとんど読めません、私は他のウェブサイトでこの問題に直面しました
valicu2000

これは非常に小さなひねりを加えた単なるcaptchaであり、ユーザーにとって困難になります。また、まったくアクセスできません。
Mihai P.

0

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

それ以外の場合は、クライアントの「人間らしさ」を証明する形式を使用せざるを得ないと思います


4
スマートロボット JavaScript 実行できます。JavaScriptソリューションを実行することで、ロボットの99%をブロックします
Ben Scheirman

ボットがブラウザープラグインの場合、JavaScriptを実行してユーザーが見るものを見ることができます(フラッシュまたはwebglのレンダリングを行っている場合でも)
CoffeDeveloper

JavaScriptが無効になっていることが心配な場合は、CSSを使用してテキストフィールドをページの上に配置してください。
Chewie The Chorkie

0

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

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

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

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

編集する

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


ユーザーとして、私はそのがらくたを嫌います。スパムは問題だと思いますが、サイトユーザーとしての私の問題はどうですか?コメントスパムはサイトの所有者にとって問題であるため、ユーザーはそれを防ぐ責任を負うべきではありません。あなたが店に歩いて行き、モップをかけたくないので靴に防護靴をかぶるように頼まれたなら、あなたはどう思いますか?ほんの数秒で完了しますが、負担する必要はありません。
マイク

@Mikiスパムはサイト所有者を時間の無駄にします。時は金なり、私が売るものはあなたにとってより高価になるでしょう。あなたの議論は、「あなたが家賃を払わなければならないことは気にしない、私は生産費+ 1 $を払いたいのです。あなたは私の家賃をどのように支払っていますか?」と言うのに簡単に使用できます。ホスティング、交通機関、時間などの代金を購入した場合
Mihai P.

@マイク-フォームを機能させたいので、それはあなたの問題です(明らかに、フォームを使用しているためです)。マシンは、最もあいまいなサイトでさえも検出し、1日に数万の送信をスパムし、それらのフォームを使用できなくします。したがって、次に小規模ビジネスにWebサイトのフォームを使用して質問を送信し、そのために9 + 3を追加する必要がある場合は、「なぜこれを行う必要があるのか​​」と自問してください。あなたの答えは「私が実際に私の質問に対する答えを求めているから」です。
神保ジョニー2016年

@JimboJonnyあなたは私のポイントを完全に逃しました。スパムは(私が述べたように)問題ですが、ユーザーエクスペリエンスを損なわないようにバックエンドでスパムに対処する方法があります。現在、私は数十(何百もの)のWebサイトに連絡先フォームを展開しています。スパムを最小限に抑えます(フォームごとに1か月に数通のスパムメッセージ)。私の要点は、スパムは問題ではないということではありませんでした。それは問題です。私のポイントは、ユーザーのエクスペリエンスを損なわずにそれに対処する方法があるということでした。
マイク

@JimboJonnyケースの適切な例として、この質問に対する最高ランクの(そして受け入れられた)回答を見てください。いかなる種類のユーザー入力も含まれません。これがスパム緩和策のあり方です。
マイク

0

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

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


0

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


0

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

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


面白いアイデア!これを現実の世界で使用したことはありますか?
skybondsor

それは動作しません。最近、スパマーはブラウザで実行されるソフトウェアを使用しています。そのため、Cookieを作成し、ソフトウェアによって生成されたさまざまなコンテンツを使用してx回実行するユーザーエクスペリエンスを模倣できます。
Norbert Norbertson 16

ユーザーがマウスを使用していない場合、これは機能しません。フォームが適切に設定されている場合、ユーザーはキーボードを使用してフォーム全体に入力できるはずです。Tabキーで次のフィールドに移動し、スペースバーを使用してラジオボタンを選択し、送信ボタンにタブで移動するときにスペースバー(またはEnter)を使用できます。
ケニージョンソン

0

使用1)トークン付きフォーム2)フォームをチェックしてIPアドレスで遅延を形成3)ブロックIP(オプション)


0

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

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

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

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


0

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

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

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

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


0
  1. 非表示のテキストボックスがあるメソッドを使用します。ボットはウェブサイトを解析するので、おそらくそれを埋めます。それからそれが空でないかどうかをチェックします。

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


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

}

0

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


好奇心から、reCAPTCHAについてどう思いますか?あなたは最初に他の有料サービスについて言及しましたが、それらはreCAPTCHAとどのように比較されますか、および/または無料サービスよりもそれらを推奨するのはなぜですか?
ホークアイ

0

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

HTML

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

ジャバスクリプト

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


-1

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.