ReadMe!不正投票マニュアル(3)
最後に安全性に関して。
何度も書きますがCGIはブラックボックスです。「投票処理」には当然「不正投票を防止する」というルーチンが組み込まれているはずですが外部からそれは見えません。
とりあえず「どのような問題点が考えられるのか」というのをピックアップしてみます。外部から処理が見えない以上、「〜考えられるのか」を考えることしか僕らには出来ない。
□1:プロキシ経由の投票だということ
投票処理には「プロキシからの投票を無効化」といった制限がかかっているかもしれません。さて、この「プロキシからの」なんですが、CGI単体で「プロキシからか生か」を断言する方法はこの世にありません。ある有名な掲示板スクリプトの「アクセスがプロキシ経由か判断するルーチン」を書いておきます。
if($ENV{'HTTP_VIA'} ne "" ){$use_proxy = 1;}
「ne」は「not equal」。いわゆる「プロキシ特有の環境変数」の参照。
if($ENV{'HTTP_X_FORWARDED_FOR'} ne ""){$use_proxy = 1;}
if($ENV{'HTTP_FORWARDED'} ne ""){$use_proxy = 1;}
if($ENV{'HTTP_X_LOCKING'} ne ""){$use_proxy = 1;}
if($ENV{'HTTP_CACHE_INFO'} ne ""){$use_proxy = 1;}
if($ENV{'HTTP_CACHE_CONTROL'} ne ""){$use_proxy = 1;}
if($ENV{'HTTP_SP_HOST'} ne ""){$use_proxy = 1;}
if($ENV{'HTTP_FROM'} ne ""){$use_proxy = 1;}
if($ENV{'HTTP_PROXY_CONNECTION'} ne ""){$use_proxy = 1;}
if($ENV{'HTTP_USER_AGENT'} =~ /via|cache|proxy|delegate/i){$use_proxy = 1;}
「=~ /A|B|・・・/i」は「AかBか・・・の少なくとも一つが含まれている」。USER AGENTに特定キーワードが含まれているか。
if($ENV{'REMOTE_HOST'} =~ /proxy|cache|via|delegate|www|mail/i){$use_proxy = 1;}
$ENV{'〜'}は環境変数です。「様々な環境変数を使って判断している」ということに注目して下さい。逆に言えば「『ここを調べればプロキシかどうか分かる』という場所はない」ということです。
もちろんリストに登録したプロキシの一部は上記のような「串弾き」にひっかかるでしょう。弾かれないプロキシもあるでしょう。
□2:機械任せだということ
ReadMe!不正投票マニュアル(1)の方法では投票間隔が大体一定になります。例えば「前々回の投票と前回の投票の間隔」と「前回の投票と今回の投票の間隔」。
「大体一定」という言い方をしたのは、「回線の関係で正確に一定になる訳ではない」ということですが。
「正確に一定」でない以上、不正投票防止ルーチンがこの不自然さに気付くことはおそらくないとは思います。しかし人間は気付くかもしれません。つまりReadMe!スタッフがログを見れば。
不安ならばJavaScriptとの連動で「リロード間隔に乱数を使う」という処理を行えばいいでしょう。具体的なソースは書きませんが。
□3:プロキシにログが残る
よく「プロキシ非万能性」を語る際に言われることですが、プロキシサーバーに接続ログが残ります。ReadMe!スタッフが「このサイトは不正投票をしていないか?」と目を付けた場合。プロキシサーバーにログ提出を求め接続者の生IPを知ることが可能でしょう。

TrackBack
この記事へのトラックバック