とある不正投票検出の話
筆者がもう何年も前に思いついて、
1人1日1票とかの継続投票サイトとかを作る時にはよく使うことにしてる
不正検出のワザの話を、書いてみようと思う。
普通に思いつく「1人1日1票」制限と言えば、
おそらくはCookieに今回の投票日時を返しておく、とかだろう。
でもこれだけだと、Cookieストアを覗かれたり書き換えられたりしたら
あっさりパスされてしまうし、
Cookie丸ごと削除や無効化でも不正検出できなくなってしまう。
じゃあIPアドレスごとに1票、なんて制限にしたら
1つのNATルーター配下に居る人たちは全員で1票になってしまうし、
切断再接続でIP割り振りの替わるプロバイダ経由やモバイルでは
複数投票し放題だったり誰かに先に使われて投票できなかったり。
では、どうしたか。
まぁCookie必須ですよ、という謳い文句はサイト上に掲げるとして、
Cookieには今回の投票日時と今回のIPアドレス、
それに初回の日時とIPアドレス(今回が初なら今回のもの)も返しておくことにして。
もちろん、生で送ったらエディットし放題なので、暗号化して。
セッションに格納してセッションキーだけをCookieに返していたら、
コピーされたCookieでもそのセッションの続きになってしまうわけで、
それを回避するために、時刻値やアドレス値そのものを返すことにしたのです。
実際には、他にも調査用にいくつかの値やランダムなダミー値も付加しましたが。
結果…コピーされたCookieを使って不正投票するbotらしきものが
結構な数検出されましたね。
もっとも、その中にはWeb先読みキャッシュだったり
それに付随した危険サイト検出システムだったりも居るわけですが、
それらだって投票値からしたらカウントすべきでない値なので
集計から除外するという意味では一緒の扱いで構わないわけです。
で、とりあえず受け付けたよという画面は共通にして、
というかそんなものは画面で毎回「不正アクセスです!」って言ってもしかたないわけで。
送られてきたデータをちゃんと解析すれば、
1台のノートPCを家と会社とモバイルで使ってるヒトとか、
ひとりで家に5台のPCを並べて複数投票してるヒトとか、
そういうのも見えてくる仕組み。
IPアドレスからジオ変換までやれば、
そんな一瞬で長距離移動できねーよ!ってのも見えてくる。
まぁココにソースコードまで晒したりはしませんが、
そういう検出機構だって実装されてるかもしれませんよ?
というお話でした。
コメントを残す