こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

PHPで回数制限をつけた投票プログラムの作成

PHPで簡易的な投票プログラムを用いたサイトを作成しています。
様々な投稿に対し、
Facebookのいいね!やtwitterのRTのように、
それぞれに投票できるようなプログラムを作成しました。
具体的には以下の通りです。

・会員登録機能のあるサイトだが、ゲストでも投票ができる
・1つの記事につき、1人1日1回まで投票可
・ゲスト状態とログイン状態を使い分ければ2ユーザーと捉え、1日2回分投票可
・ログイン状態の場合、DBにIDと記事番号と投票日のログを残す
・ゲスト状態の場合、ゲストIDを発行し、セッション変数に保存、DBにゲストIDと記事番号と投票日のログを残す

ここで問題となるのが、
ゲストIDの発行が、クッキーを削除してしまえば何度でもできてしまうため、クッキーを削除することでゲストの場合、何回でも投票できてしまうという点です。
このままゆるい制限でもいいのかなーとも思ったのですが、
やはり厳密にしておかねば、
サーバーへの負荷にもなりかねないと思い、
何か良い手はないかと質問させて頂きました。
ゲストログ保存用のテーブルのみ、IPを保存し、IPで制限するというのも考えたのですが、
複数PCで同一IPを使用しているゲストの場合に動作が厳密すぎて投票ができなくなりかねない気がします。

何か良い手はないでしょうか?

補足ですが、PHPで作られているかはわかりませんが、
「stampers」というLINEスタンプの投票サイトのLOVEボタンが、
クッキーを削除してもログが残っており、且つ、
同一IPの別のパソコンから投票する場合はきちんと初回として処理されているので、
同じようにできればきちんと識別できたら良いなと思っています。


ご回答、よろしくお願いします。

投稿日時 - 2015-07-07 15:01:00

QNo.9007794

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

結論から言ってしまうと、ゲスト状態で1度の投稿に完全限定するのは不可能です。どの方法を用いても、偽装することが可能だからです。ただ、複合的に使い分ければ、複数回投稿しづらくすることは可能です。
cookieと同様にブラウザに情報を残す方法として、以下の機能があります。

・cookie
・localStorage
・flash vas(shared object) ただしpcのみ


もちろん、これらはユーザーの意思によって自由に削除することができますが、すべてをリセットする方法知っているユーザーは、クッキーのそれよりも少ないでしょう。特にFlash Varsに関しては期待できそうです。ただし、これらの方法は、ブラウザを変更されると、やはり投稿が可能になるので、所詮その範囲の対策です。


次に考えられるのは、ブラウザではなくサーバー側に記録する方法です。既に回答がありますが、IPアドレスの記録が一般的でしょう。ただし、IPの偽装は可能ですし、ルーターのリセットなどでも簡単に書き換えることができます。その点で完全ではありません。また、IPでの制限は、前述のブラウザに記録するタイプの制限と比較して範囲が強く、ブラウザが変更にも対応できますが、逆に、同じIPを使用する全てに制限をかけてしまう強さがあるため、たとえば、学内のネットワークからアクセスした際に、そのネットワークを利用するすべての人が制限対象になります。

ご利用は計画的に。

投稿日時 - 2015-07-07 23:27:27

ANo.3

IPアドレスやUserAgent等の組み合わせで一意性を判断するしか無いでしょう。
「stampers」もUA変えたりCookie削除したりすると複数回投票できるようですから、同じような考えで判断してるんじゃないでしょうか。

投稿日時 - 2015-07-07 15:57:43

お礼

ご回答ありがとうございます。
>IPアドレスやUserAgent等の組み合わせで一意性を判断するしか無いで
>しょう。
>「stampers」もUA変えたりCookie削除したりすると複数回投票できる
>ようですから、同じような考えで判断してるんじゃないでしょうか。
なるほど。
単にcookieのみよりもJavascriptのUserAgentを組み合わせた方が強固になりますね。
その方向性でプログラムを組もうと思います。

投稿日時 - 2015-07-07 16:39:11

ANo.2

厳密には出来ないと思いますよ。

IPアドレスは一般の人でもルーター再起動するだけでも簡単に変えられますし、cookieも削除してしまえばそれまでです。

ですが、これらの方法を複数組み合わせると厳密に近づくのではないかと思います。

最終的には、ログインユーザーに対してもどれくらい厳密な登録をしようとしているのかわかりませんが、メールアドレスがあれば登録できるとすれば、複数のメールアドレスがあれば登録出来ると言うことになります。

それよりも、同一IPアドレスから連続したリクエストを弾いてしまった方がサーバー負荷の軽減に繋がるのではないかと思います。

投稿日時 - 2015-07-07 15:50:28

お礼

ご回答ありがとうございます。
>IPアドレスは一般の人でもルーター再起動するだけでも簡単に変えられ
>ますし、cookieも削除してしまえばそれまでです。

>ですが、これらの方法を複数組み合わせると厳密に近づくのではないかと
>思います。
確かに、他の方も仰られるようにJavascriptと組み合わせれば、
厳密になりそうですね。

>最終的には、ログインユーザーに対してもどれくらい厳密な登録をしよう
>としているのかわかりませんが、メールアドレスがあれば登録できると
>すれば、複数のメールアドレスがあれば登録出来ると言うことになりま
>す。
メールアドレスを預るのが怖いので、任意ID制の為、
その時点で登録に関してはザルいですが、
ゲストユーザーの投票に比べるとワンクッションあるので、
サーバー負荷は減らせるのでは?と思っています。

>それよりも、同一IPアドレスから連続したリクエストを弾いてしまった
>方がサーバー負荷の軽減に繋がるのではないかと思います。
レンタルサーバーで専用サーバーに比べ、負荷には弱いと思うので、
こちらは調べて是非、取り入れたいと思います!

投稿日時 - 2015-07-07 16:36:43

ANo.1

JavaScriptで取得したローカルPCの情報(をサーバにAjaxで送信したもの)とphp側で取得したIPアドレスなどを組み合わせるという手はあるかもしれません(「JavaScript PC情報」とかで検索すれば出てきます)。

が、

・同一PCの別ブラウザ
・同一PCに別ユーザでログオンしたとき

とかはどうするんでしょうか?

投稿日時 - 2015-07-07 15:41:47

お礼

ご回答ありがとうございます。
>JavaScriptで取得したローカルPCの情報(をサーバにAjaxで送信したも
>の)とphp側で取得したIPアドレスなどを組み合わせるという手はあるか
>もしれません(「JavaScript PC情報」とかで検索すれば出てきます)。
なるほど、javascriptと組み合わせれば、ユニークにかなり近くなるかもしれませんね。
>・同一PCの別ブラウザ
こちらについては多少諦めています。
メジャーなブラウザでも5つくらいなものですので、ゲスト状態でブラウザを変えての投票には多少目をつむろうかと・・・

>・同一PCに別ユーザでログオンしたとき
こちらはできれば別々で投票したいと思っていますが、
中々難しそうなので、
同一PCでの投票は重複とみなす方向で
サーバーへの負荷 > ゲストユーザーへの処遇
に重きを持ってプログラムを組もうと思います。
ログインユーザーが別であれば同一PCでも投票はできますので。

投稿日時 - 2015-07-07 16:27:32

あなたにオススメの質問