======================================================= Proxy対策 1997年10月30日 ======================================================= 最近、Proxyの匿名性を利用した悪戯書き込みがよくあるみたいで... 一応対策案をしめしておきますね...。 Squid系のProxyは、環境変数の中に、本来のIPを入れてきますので、 それを取得するようにします。 ちなみに、CERNのProxyは、HTTP_USER_AGENTにviaを付けるだけのものが多いです。 最初から匿名性をうたっているProxy(串)は、スクリプトで弾くのではなく、 .htaccessファイルによるアクセス制限を利用しましょう。 ◆(1)ちょっとだけ対策 悪戯抑止のために、本来のIPをできる限り取得するだけのものです。 ### 今まで、 $host=$ENV{'REMOTE_HOST'}; の一行を、 $host = &gethost; に変えて、下記のサブルーチンを追加する。 sub gethost{ $host=$ENV{'REMOTE_HOST'}; $host2=$ENV{'HTTP_VIA'} if( $ENV{'HTTP_VIA'}=~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ); $host2=$ENV{'HTTP_X_FORWARDED_FOR'} if( $ENV{'HTTP_X_FORWARDED_FOR'}=~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/ ); $host2=$ENV{'HTTP_FORWARDED'} if( $ENV{'HTTP_FORWARDED'}=~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ); $host .="[$host2]" if($host2);#$host2があれば、$hostに追加。 return $host; }#gethost END ◆(2)もう少し対策 本来のIPを取得できれば、Proxyの利用を許可します。 Proxyを利用せざるを得ない特殊な環境の人のために、専用のCGIを用意しておきませう。 ### 今まで、 $host=$ENV{'REMOTE_HOST'}; の一行を、 $host = &gethost; に変えて、下記のサブルーチン2つを追加します。 sub gethost{ local($proxycheck,$host,$host2); $proxycheck=0; $proxycheck=1 if($ENV{'HTTP_VIA'}); $proxycheck=1 if($ENV{'HTTP_X_FORWARDED_FOR'}); $proxycheck=1 if($ENV{'HTTP_FORWARDED'}); $proxycheck=1 if($ENV{'HTTP_USER_AGENT'}=~/via/i); #exit if($proxycheck);#串チェックに引っかかれば終了...っておいおい。でもこれも効果的かも。 $host=$ENV{'REMOTE_HOST'}; if( $ENV{'HTTP_VIA'}=~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ){ $host2=$ENV{'HTTP_VIA'};$proxycheck=0;} if( $ENV{'HTTP_X_FORWARDED_FOR'}=~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/ ){ $host2=$ENV{'HTTP_X_FORWARDED_FOR'};$proxycheck=0;} if( $ENV{'HTTP_FORWARDED'}=~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ){ $host2=$ENV{'HTTP_FORWARDED'};$proxycheck=0;} &proxyerror if($proxycheck); $host .="[$host2]" if($host2);#$host2があれば、$hostに追加。 return $host; }#gethost END sub proxyerror{ print "Content-type: text/html\n\n"; print <<"_HTML_";