4

GoogleAppEngineでPythonを使用して簡単なブログを作成しました。投稿ごとに投票システムを実装したいと思います。私の投稿はSQLデータベースに保存されており、投票数の列があります。誰かが私が個々の投稿に投票ボタンを設定するのを手伝ってもらえますか?テンプレートエンジンとしてJinja2を使用しています。

どうすれば投票を安全にできますか?誰かが投票ボタンをクリックしたときにPOST/GETを送信することを考えていました。投票ボタンをクリックすると、Pythonスクリプトがそれに応じてデータベースを読み取り、更新します。しかし、それから私はこれが安全ではないことに気づきました。すべての提案を歓迎します。

4

2 に答える 2

4

まず、「安全」などというものはなく、単に「X に対して十分に安全」であることに注意してください。常にトレードオフがあります。安全性が高いということは、正当なユーザーにとっては煩わしく、コストも高くなることを意味します。

これらの一般論を乗り越えて、あなたの特定のケースについて考えてください。ユーザーと1対1の関係にあるものはありません。多くの場合、IP アドレスまたはコンピューターは複数の人によって共有されます。同時に、人々は複数のアドレスまたはコンピューターを持っていることがよくあります。時々、このようなものは「十分」ですが、あなたの質問からは、そうではないように聞こえます.

ただし、ユーザー アカウントの場合、意図的に複数のアカウントを作成したり、他のユーザーのアカウントをハッキングしたりすることによる偽陰性のみが発生し、偽陽性はありません。そして、煩わしさ/コストとセキュリティのトレードオフにはかなり直線的な曲線があります。「靴下人形を作成しないでください」から CAPTCHA、クレジット カード チェック、信頼/評判スコアのウェブ、実際の情報を求めるまでのすべての段階でです。そしてそれをチェックするために調査員を雇います。

実生活では、これら 2 つ以上のものの間にトレードオフが存在することがよくあります。たとえば、不正行為が直接あなたにとってより多くのお金を意味する場合、より多くの不正行為を受け入れる場合は、人々に実際のお金を請求して投票することができます (多くのテレビ番組が使用する 1 ~ 900 行のように)。


Reddit と Digg は、単一の登録ユーザーからの複数の投票をどのようにチェックしますか?

Reddit や Digg がどのように機能するかは正確にはわかりませんが、一般的な考え方は単純です: 個々の投票を追跡します。

通常、ユーザーは何らかの SQL RDBMS に格納されています。Votesしたがって、ユーザー ID、質問 ID、および回答の列を含むテーブルを追加するだけです。(何らかの NoSQL ソリューションを使用している場合、適切に翻訳するのは簡単なはずです。たとえば、各質問のドキュメントがあり、ドキュメントはユーザー ID を回答にマッピングする辞書であるとします。) ユーザーが投票するときは、単にINSERTデータベースへの行。

サーバー側のテンプレートまたはクライアント側の AJAX を介して投票インターフェイスをまとめるときは、既存の投票をチェックする関数を呼び出します。ある場合は、投票コントロールを表示する代わりに、「あなたはすでに賛成に投票しました」という表現を表示します。また、投票の記録時に再度チェックして、ページの 200 のコピーを開いて (ユーザーがまだ投票していないため) 投票を許可し、200 を送信することによって誰かがシステムをハッキングしていないことを確認する必要があります。はい投票しますが、SQL データベースでは、これはQuestion, User複数列の一意のキーにするのと同じくらい簡単です。

投票の変更または取り消しを許可したい場合は、インターフェイスにコントロールを追加し、それらをUPDATEandDELETE呼び出しで処理します。このサイトのように、十分な数の担当者がいて、元の投票が過去 5 分間に行われたか、投票後に回答が編集された場合 (またはそのようなもの) に元に戻すことができるように、本当に凝ったものにしたい場合は、ユーザーごとに 1 つの回答だけではなく、投票アクションごとにタイムスタンプを付けて行を記録するなど、いくつかの追加情報を保持する必要があります。

この設計は、どこかにカウントを保持する代わりに、たとえばSELECT COUNT(*) FROM Votes WHERE Question=? GROUP BY Answer. ただし、いつものように、これが遅すぎる場合は、いつでも非正規化による最適化を行い、実際の投票と一緒に合計を保持できます。同様に、ユーザー ベースが巨大な場合は、古い質問に対する投票をアーカイブして、運用データベースから取り出したい場合があります。等々。

于 2013-01-15T23:53:15.047 に答える
1

投票が購読ユーザーのみの場合は、メンバーがサイトにログインした後に投票を有効にします。そうでない場合は、ユーザーの IP アドレスを追跡して、1 つの IP アドレスが 1 つの記事に 1 日に 1 回投票できるようにします。

ところで、どんなセキュリティが必要ですか?

于 2013-01-15T21:31:57.107 に答える