質問: ### 前提・実現したいこと ウェブページで1人1回のみ投票できるような機能を作ろうとJavascriptとPHPで構成を考えたのですが 上手く制御する方法が思いつかないので質問します。 投票する項目は動的に増加していくものを想定しています。 データベースには投票の結果のみを記録しクライアントの情報などその他の情報は、 データ量節約の為に保存しないようにしたいです。 ユーザーへの負担を減らす為にもアカウント登録制なども避けたいです。 ### 発生している問題・エラーメッセージ PHPにPOSTでデータを送りPHPからデータベースへPOSTされたデータを保存する所までは作りました。 次に1人1回までという制限を作ろうと考えたのですが、POSTデータを覗かれると意図的にそのデータを作成してPHPに投げることができると気付いたので、上手く制御する方法が思いつきません。 たとえlocalstorageやcookieでPHPに渡すプログラムを制御したとしても最初に通すPOSTデータをコピーしてそのまま通せば何度でも通ってしまうと考えています。 データベースを消費して照合させる方法などは思いつくのですが容量削減の為に断念しました。 POSTの中身を覗かれないような方法があれば一番良いと考えているのですがそのような方法はありますか? また皆様でしたら、登録制なしでデータベースには結果のみ保存という条件で1人1回の制限を実装するにはどのような方法を考えますか?
回答: 1. 既に投票したIPアドレスからの投票を拒否する。 2. Cookieでの制限をする。 3. ユーザーエージェントで判断する。 以上の3点だけで通常は投票回数を制限するには事足りると思います(例外ももちろんありますが)。 あとは、悪意のある利用者に対する対策を行うと良いと思います。以下に例を挙げておきます。 * reCAPTCHAを使う。 * Proxy経由での投票を拒否する。 * 海外ホストからの投票拒否。 * CSRF対策, Refererの判定。 個人的には、IPアドレスによる制限とreCAPTCHAの導入を推奨しますが、IPアドレスの制限に関しては**NATやProxyで複数IPを束ねている場合などに投票が正しくできない**事態が発生するので、導入するときには注意するべきだと思います。 また、実際はこれだけ対策しても1人1回のみの投票を実現することはできません(ほぼ不可能だと思います)。しかし、不正な投票の割合は対策を怠っていた場合よりも減ると思うので、やっておくにこしたことはありません。 Webアプリケーションのセキュリティに関連する色々なことはここに載っているので、一度みてみると参考になるかもしれません。