2

Ubuntu、Apache、Djangoを使用してWebサイトを構築しています。自分のサイトで特定のフォームに複数回入力して送信することをブロックしたいと思います。決心したユーザーがIPアドレスを変更したり、Cookieを削除したりするのをブロックすることはほとんど不可能です。私が探しているのは、カジュアルユーザーが再送信するのを思いとどまらせるものだけです。

同じIPアドレスからの複数のフォーム送信をブロックすることが、私が探しているものを達成するための最良の方法であるように思われます。ただし、これをどのように行うべきか、Apacheから行うべきかDjangoから行うべきかがわかりません。任意のヒント?

編集:意図しない二重提出だけでなく、意図的な再提出を防ぐことを目指しています。たとえば、人々が何度も投票するのを思いとどまらせたいという調査があります。

4

8 に答える 8

5

誰かがスクリプトを書いてフォームを何度も自動的に送信するのを防ぐことが主な関心事である場合は、フォームでCAPTCHAを使用することをお勧めします。

于 2009-04-26T06:35:29.800 に答える
3

いくつかの国全体がNAT処理されており、一部の(ほとんど?)大規模な多国籍企業も、それぞれ数十万人のユーザーを抱えています。IPで何かをブロックするのは悪い考えです。

代わりにCookieを選択してください。これは、取得するのと同じくらい優れています。ユーザーにログインさせることもできます。その場合、そのログインに対してフォームが繰り返し送信されたかどうかがわかります。

于 2009-04-26T05:44:32.980 に答える
1

私はセッションIDを使用し、フォーム送信をセッションID、タイムスタンプ、およびオプションで何らかのフォーム識別子を含むテーブルに格納します。次に、フォームが送信されたときに、テーブルをチェックして、特定の期間内にフォームが発生しなかったことを確認できます。

于 2009-04-26T05:45:49.153 に答える
1

IPアドレスやCookieのフィルタリングはどちらも簡単に回避できますが、ブラウザの問題や焦りなどが原因で、カジュアルなユーザーが誤って同じものを何度も送信するのを防ぐことができます。

それよりも優れたものが必要な場合は、ログインを実装できますが、もちろん、それによって多くのユーザーが応答できなくなります。

于 2009-04-26T05:46:44.737 に答える
1

隠しフィールドで単調に増加するID番号をフォームに追加します。

各フォームが送信されたら、IDを「使用済み」リスト/マップに記録します(または使用済みのマークを付けるなど、実装の詳細)。

同じIDをもう一度取得した場合(すでに使用済みのマップにある場合)、ユーザーに二重送信したことを通知します。

于 2009-04-26T05:47:33.220 に答える
1

絶対確実なものはありませんが、次のような提案をします。ユーザーがフォームをオンにしてページを読み込むと、Cookieが設定され、Cookieの値に固定の秘密の文字列が追加され、このmd5値が次のように書き込まれます。フォーム上の非表示フィールド。ユーザーがフォームにアクセスするたびに、新しい値が生成されることを確認してください。

ユーザーがフォームを送信するときは、Cookieの値とフォームの値が一致していること、ユーザーに指定されたCookieが以前にフォームの送信に使用されていないこと、リファラーIDがフォームのURLと一致していることを確認します。オプションで、過去2分間にそのIPからの投稿が試みられていないことを確認します(ほとんどの人にとって問題にならないほど高速ですが、ボットの速度を低下させるのに十分な速度です)。

これを修正するには、ユーザーはページをロードするスクリプトを作成し、Cookieを保存して、正しい値を送信する必要があります。これは、ユーザーがフォームを送信するだけの場合よりもはるかに困難です。

編集に基づいて追加:Djangoフレームワークでユーザーをブロックします。これにより、ユーザーにはるかに優れたエラーメッセージを表示でき、そのフォームからユーザーをブロックするだけです。

于 2009-04-26T06:02:07.540 に答える
1

これは認証と承認の問題であり、これらは関連していますが同じではありません。承認を管理するには、最初にユーザーを認証(確実に識別する)する必要があります。

これを意図的な誤用に抵抗させたい場合は、ユーザー名とパスワードだけでなく、口座を開設するときに銀行が要求するものに沿って、ユーザーを個人的に識別する情報を要求することになります。出血している心と左利きはプライバシーの侵害について際限なく詮索しますが、実際にはあなたは銀行とまったく同じことを、まったく同じ理由でやっています。

大変な作業であり、法律の影響を受ける可能性があります。本当にやりたいですか?

于 2009-04-26T06:56:14.397 に答える
1

以下のメソッドはすべて、実装もハッキングも比較的簡単です。Firebug を持っていて少し知識がある人は、まばたきさえしません。

次の JavaScript は Mootools を使用しており、バグがないことを確認していません。JQ の構文はほとんど同じであり、生の JS も十分に似ていることを理解しているので、その点は明らかです。

1)フォームがAJAX経由で送信されている場合は、送信する前に確認できます(明らかなことを言っているだけなら申し訳ありません)。

var sent = 0;
$('myForm').addEvent('submit', function(){
    if(!sent) this.send(); 
})

これは本当に簡単で、ページをリロードするまでは驚くほど効果的です。

2) JavaScript クッキーを追加します。繰り返しますが、Mootools を使用すると:

$('myForm').addEvent('submit', function(){ 
     if(Cookie.read('submitted')){ alert('once only'); return false;}
     else{ Cookie.write('submitted', 1); return true; }
})

これは、ユーザーがページをリロードしても機能します。

3) Python セッション Cookie を追加します。私は Python に詳しくありませんが、PHP のようなものであれば、方法 2 よりも利点はありません。どちらの場合でも、ユーザーは FireCookie または WebDeveloper Toolbar (または他のブラウザーの同等のもの) を使用して Cookie を削除し、ページをリロードできます。 .

4) Flash Cookie を追加します (Flex を使用)。これは理想的です。Flash Cookie は別の場所に保存され、わかりにくく、削除するのが非常に困難です。唯一の欠点は、小さな SWF を作成して埋め込む必要があることです。

5) 非表示フィールドに値を格納し、値を確認します。内部リンクにハッシュを追加して、ページが移動された場合でも値が入力されたままになるようにすることができます。

6) 訪問者ごとに URL (または htaccess を使用したカスタム URL) をインクリメントして、他のゲームをプレイできます。

swf Cookie は、他のものと組み合わせることができますが、上記の最良のアイデアです。

于 2009-04-26T08:00:35.680 に答える