2

投票のために、SO は投稿コントローラーに POST し、URL を介して投稿 ID と投票タイプを送信する XHR メソッドを実装し、さらにfkeyパラメーターが送信されることに気付きました。

http://stackoverflow.com/posts/1/vote/2

これを実装する際の全体的なロジックに加えて、同じユーザーによる重複投票を防ぎ、スパムを防ぐためにどのようなロジックを使用できるか疑問に思っています。

それらを格納するテーブルのスキーマ:

thread_id   user_id   vote_type
2334        1         2

これまでのところ、これらの箇条書きを思いつきました:

  • ユーザーがログインしていることを確認する
  • 有効な投稿 ID と有効な投票タイプが送信されていることを確認する
  • POST 後、ユーザーが以前に投票していないことを確認します。
  • ハッシュを作成するコードには、ユーザー エージェントなどの動的な情報を含めることはできません。ユーザーは別のブラウザーや別の OS を使用している可能性があるからです。

アップデート:

「SO はおそらくログイン Cookie を使用してユーザーを識別しています。」- アンドリュー

誰かがこれがどのように行われるかを示すことができますか、言い換えればfkey、英数字の 32 ビット文字列である がどのように生成されるかの例をより具体的に提供できますか?

質問:

  • XHRコードで実際のユーザーIDをどこにも送信していないので、テーブルスキーマを更新して、fkey代わりにを格納できるようにする必要がありuser_idますか? はfkeyおそらく各ユーザーに固有である必要があるため、投票テーブルに任意の fkey を持つ行があるかどうかを照会できます。

同様の手法を実装した人に関するヒントや洞察をいただければ幸いです。

4

3 に答える 3

2

フィールド(thread_id、user_id)にUNIQUEインデックスを作成すると、DBengineは1つのスレッドでの多数のコメントから保護します:)

于 2010-01-12T07:20:07.207 に答える
1

ユーザーがvaluseを操作するのを防ぐために、何らかの方法でURIに署名することができます。たとえば、URIの一部をシークレットでハッシュし、そのハッシュをURIに追加できます。ユーザーがURIをコピーして値を変更すると、URIと署名された部分が無効になります。

これはRESTfulAPIで行われることが多く、現在のアプローチはに似ています。

于 2010-01-11T22:04:35.023 に答える
1

それは、人々があなたのデータを再送信したりいじったりするのをどれだけひどく防ぎたいかによると思います. 100% というものはありませんが (予算が限界を超えている場合を除きます)、次の方法でほとんどの人が再提出しないようにすることができます。

  • UID を確認する - または UID から生成された ID (説明します)
  • IP アドレスを記録し、DB で IP と提出 ID を確認します (生成された UID とともに)

IP ソリューションを単独で使用することは、もちろんプロキシを使用するか、私の街の DSL キャリアのように頻繁に IP を変更する接続を使用することによって打ち負かすことができます (ただし、それでも数日おきに)。その人物の UID に基づいて一意のキーを個人的に生成し、必要に応じてそれを前後に渡します。通常、salted MD5 ハッシュは問題なく機能しますが、MD5 が弱すぎると見なされた場合は AES 実装でさえも機能します。組み合わせると、良い出発点になるはずです。

于 2010-01-11T22:19:19.787 に答える