web-dev-qa-db-ja.com

ボットフォーム送信の防止

プロセスをシンプルに保ちながら、ボットがフォームを送信しないようにする良い方法を見つけようとしています。いくつかの素晴らしいアイデアを読みましたが、フォームの送信時に確認オプションを追加することを考えました。ユーザーが[送信]をクリックすると、ユーザーの操作を必要とするプロンプトが表示されるJavascriptが確認されます。

これはボットを防ぎますか、またはボットがこれをあまりにも簡単に理解できるでしょうか?以下は、私のアイデアを示すためのコードとJSFIddleです。

[〜#〜] jsfiddle [〜#〜]

$('button').click(function () {
  if(Confirm()) {
    alert('Form submitted');
    /* perform a $.post() to php */
  }
  else {
    alert('Form not submitted');
  }
});

function Confirm() {
  var _question = confirm('Are you sure about this?');
  var _response = (_question) ? true : false;
  return _response;
}
25
Mike

これは、多くの人が遭遇した問題の1つです。 user166390がコメントで指摘しているように、ボットはjavascriptをバイパスして情報をサーバーに直接送信できます( cURLPostman などの単純なユーティリティを参照)。現在、多くのボットがjavascriptを使用して対話することができます。 Hari krishnanは captcha の使用を指摘しています。これは(私の知る限りでは) reCaptcha です。しかし、キャプチャには 問題 があり、主に 非有効性とアクセス不能 の理由で、World Wide Webの大要によって推奨されていません。

忘れないように、攻撃者はいつでも人間の知能を利用してキャプチャを破ることができます。労働者が違法行為に参加していることに気付かずに、攻撃者がスパムの目的でキャプチャをクラックするためにお金を払っているという話があります。 Amazonは、このようなことに取り組む Mechanical Turk と呼ばれるサービスを提供しています。アマゾンは、悪意のある目的でサービスを使用する場合、激しく反対します。これには、費用がかかり、紙の証跡を作成するという欠点があります。ただし、erhmのような異論を抱かないプロバイダーは他にもあります。

だからあなたは何ができますか?

私のお気に入りのメカニズムは、非表示のチェックボックスです。 「サービスの利用規約に同意しますか?」などのラベルを付けます。おそらく、いくつかの深刻な用語へのリンクがあっても。ただし、デフォルトでチェックなしに設定し、CSSで非表示にします。ページ外に配置し、高さまたは幅がゼロのコンテナに配置し、Zインデックスを高くしてdivをその上に配置します。ここで独自のメカニズムを使用して、創造力を発揮してください。

秘密は、人間にはチェックボックスが表示されないことですが、mostボットはページを検査し、実際の視覚ではなく直接操作することでフォームに入力します。したがって、そのチェックボックスの値セットに含まれるすべてのフォームを使用すると、人間が入力しなかったことを知ることができます。この手法は ボットトラップ と呼ばれます。自動フォーム入力ボットのタイプの経験則は、人間が個々のサイトを克服するために介入しなければならない場合、彼らは彼らの広がりによって得たすべてのお金を(時間の形で)失ったということですスパム広告。

(以前の経験則では、フォーラムまたはコメントフォームを保護していると想定しています。実際の金銭または個人情報がオンラインにある場合は、1つのヒューリスティックよりも多くのセキュリティが必要です。これはまだ 隠蔽によるセキュリティ 偶然のスクリプト攻撃からあなたを守るには、あいまいさだけで十分であることがわかります。これがすべての攻撃からあなたのウェブサイトを保護すると考えて自分を欺かないでください。

秘密のもう半分はそれを維持することです。ボックスがチェックされている場合は、いかなる方法でも応答を変更しないでください。同じ確認、ありがとう、またはその後のメッセージやページを表示します。これにより、ボットが拒否されたことを知ることができなくなります。

私はタイミング法のファンでもあります。サーバー側に完全に実装する必要があります。ページが永続的に配信された時間(本質的にはセッション)を追跡し、フォーム送信の時間と比較します。これにより、偽造を防止したり、ボットに時間切れであることを知らせたりすることができます。フォームまたはjavascriptを使用している場合は、より洗練されたアプローチを使用して、自分が参加していることを通知します。

繰り返しますが、同じお礼ページを提供している間は静かにリクエストを破棄します(または、もしあなたが意欲的でありたいなら、スパムフォームへの応答に遅延を導入します-これは、あなたのサーバーを圧倒することを妨げないかもしれませんし、彼らに圧倒させるかもしれませんより多くの接続をより長く開いたままにすることで、より高速になります。その時点で、ハードウェアソリューション、ロードバランサー設定のファイアウォールが必要です。

多くの場合、ブルートフォースパスワードの試行という形で、攻撃者の速度を落とすためにサーバーの応答を遅らせることについて多くのリソースがあります。 このITセキュリティの質問 は良い出発点のようです。

キャプチャに関する更新

私はしばらくの間、コンピュータビジョンとフォーム送信のトピックに関してこの質問を更新することを考えていました。最近、コンピュータビジョン愛好家である Steve Hicksonによるこのブログ投稿 を指す記事が浮上しました。 Snapchat(どうやらソーシャルメディアプラットフォームですか。私はそれを使ったことがないので、毎日年を取っています...)ゴーストを含む写真(漫画)を識別する必要がある新しいキャプチャのようなシステムを立ち上げました。スティーブは、これは提出者に関する不法行為を検証しないことを証明しました。なぜなら、典型的な方法では、コンピューターはこの単純なタイプの画像を識別するのに優れていて高速だからです。

同様のアプローチを他のCaptchaタイプに拡張することを想像するのは難しくありません。検索を行ったところ、これらのリンクも興味深いものでした。

reCaptchaが壊れていますか?
実用的で非画像ベースのキャプチャ
CAPTCHAを倒せることがわかっているのに、なぜそれらをまだ使用しているのですか?
CAPTCHA画像を使用するための真の代替手段はありますか?
ハッカーのトリオがGoogleのreCaptchaをひざまずかせた方法 -オーディオキャプチャに関するものなので、さらに興味深い。

ああ、そして私たちは義務 XKCD comic なしで完全ではないでしょう。

63
Patrick M

今日、フォームの継続的なスパム送信を正常に停止しました。もちろん、この方法は常に機能するとは限りませんが、単純であり、この特定のケースではうまく機能しました。

私は次のことをしました:

  • フォームのアクションプロパティをmustusejavascript.aspに設定します。これは、送信が機能せず、訪問者がJavaScriptを有効にする必要があるというメッセージを表示するだけです。

  • receivemessage.aspのように、フォームのアクションプロパティを実際の受信ページに設定するjavascript関数にフォームのonsubmitプロパティを設定します

問題のボットは明らかにjavascriptを処理しないため、スパムは見当たりません。また、(javascriptが有効になっている)人間にとっては、不便や余分な操作はまったくありません。訪問者がjavascriptをオフにしている場合、提出するとそのことについて明確なメッセージが表示されます。

4
Magnus

あなたのコードはボットの送信を妨げることはありませんが、それはあなたのコードがどうであるかによるものではありません。一般的なボットは、URL(action属性)への外部/自動POSTリクエストを行う可能性が高くなります。典型的なボットは、HTML、CSS、またはJavaScriptをレンダリングしません。彼らはHTMLを読んでそれに作用しているので、クライアントロジックは実行されません。たとえば、URLのCURLingは、JavaScriptをロードまたは評価せずにマークアップを取得します。 <form>を探し、一致するキーを使用してそのURLにCURL POSTを実行する単純なスクリプトを作成できます。

それを念頭に置いて、ボットの送信を防ぐサーバー側のソリューションが必要です。 Captcha + CSRFで十分です。 ( http://en.wikipedia.org/wiki/Cross-site_request_forgery

3
Matt Lo

フォームにcaptchaを追加するだけです。キャプチャはdifferentであり、imagesにもあるため、ボットはdecodeできません。これは、すべてのウェブサイトで最も広く使用されているセキュリティの1つです...

2
Hari krishnan

javascriptでは目標を達成できません。クライアントがJavaScriptを解析してメソッドをバイパスできるためです。サーバー側でキャプチャを介して検証を行う必要があります。主なアイデアは、サーバー側にシークレットを保存し、サーバー側でシークレットを使用してクライアントから送信されたフォームを検証することです。

2
oguzhanyalcin

いいえ、CaptchaまたはReCapは安全だとまだ考えていますか?

ボットはすぐに日がスマートになり、OCRツールを使用して画像上の文字を簡単に認識できるようになります

自動フォーム送信から自分を守る最良の方法は、送信するフォームを表示するたびに、生成された(そして現在のクライアントのサーバーのセッションに保存された)隠しハッシュを追加することです!

ボットまたはゾンビがフォームを送信すると、指定されたハッシュが保存されたハッシュと等しいかどうかを確認します;)

詳細について[〜#〜] csrf [〜#〜]

2
ucefkh

テキストボックスを永遠に埋める必要がないと申し出た登録時間を測定できます。

1
Mikatsu

プログラムによる入力の登録を妨げるフォーム入力検証を実行しました。

私の最初の戦術は、要素をつかみ、望んでいたオプションに設定することでした。入力フィールドにフォーカスを当て、各要素のクリックをシミュレートしてドロップダウンを表示し、値を変更するイベントを起動する値を設定しました。しかし、クリックしようとしたときに、変更として登録されていない入力を保存します。

    ;failed automation attempt because window doesnt register changes.
    ;$iUse = _IEGetObjById($nIE,"InternalUseOnly_id")
    ;_IEAction($iUse,"focus")        
    ;_IEAction($iUse,"click")
    ;_IEFormElementOptionSelect($iUse,1,1,"byIndex")
    ;$iEdit = _IEGetObjById($nIE,"canEdit_id")
    ;_IEAction($iEdit,"focus")
    ;_IEAction($iEdit,"click")
    ;_IEFormElementOptionSelect($iEdit,1,1,"byIndex")
    ;$iTalent = _IEGetObjById($nIE,"TalentReleaseFile_id")
    ;_IEAction($iTalent,"focus")
    ;_IEAction($iTalent,"click")
    ;_IEFormElementOptionSelect($iTalent,2,1,"byIndex")
    ;Sleep(1000)
    ;_IEAction(_IETagNameGetCollection($nIE,"button",1),"click")

これにより、マウスの動作を直接操作して、マウスタイプの動作でより多くの選択をシミュレートすることで、入力をどのように入力できるかを考え直すことになりました。言うまでもなく、企業の製品画像を更新するために画像を1つずつ手動でアップロードする必要はありません。ディレクトリの終わりにスクリプトを置くために文字の前にウィンドウ番号を使用し、画像アップロードウィンドウがポップアップしたとき、アクティブなアクセシビリティを使用してウィンドウからsyslistviewを取得し、写真である2番目の要素を選択する必要があります。または、findfirstfileの最初の要素は、ファイル呼び出しのみを返します。名前を使用してアイテムのデータベースでアイテムを検索し、それらのアイテムにアクセスし、画像のアップロード後にいくつかの属性を更新します。その後、そのフォルダーから別のフォルダーにファイルを移動して、再度処理されないようにしますリストの次の最初のファイルに移動し、更新の最後にスクリプト名が見つかるまでループします。

控えめなデータ入力者が時間を節約し、これらすべての悪形式検証チェックと戦う方法を共有するだけです。

よろしく。

素晴らしいアイデア。

しばらくしてre-captchaを削除して、contactform.htmlをcontactform.aspに変換し直し、これをトップに追加しました(明らかに、sendmailなどのいくつかの機能を完全に埋めるためにいくつかのコードを入れて、フォームに完全に記入するなど)。

    <%
     if Request.Form("Text") = 8 then
        dothis
      else
        send them to google.com
     end if
   %>

フォーム上にテキストという名前の基本的なテキストフィールドを貼り付けたので、何も何も指定していないように見えるので、下のボックスに2 + 6 =を入力することを示すテキストを2行上に赤で貼り付けましたリクエストを送信してください。

0
FenceGuy

これは非常に短いバージョンであり、4年前に私のサイトに実装されて以来、失敗していませんでした。これは、必要なすべての変数とif elseステートメントで構築できます

    function spamChk() {
    var ent1 = document.MyForm.Email.value
    var str1 = ent1.toLowerCase();
    if (str1.includes("noreply")) {
    document.MyForm.reset();
    }

<input type="text" name="Email" oninput="spamChk()">

私は実際に今日ここに来て、特定のスパムボットIPアドレスをH E L Lにリダイレクトする方法を見つけました。

0
Kickenback61