======================================================= 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_"; Proxyエラー

Proxyエラーによりアクセスできません。


あなたの利用されているProxyサーバは当掲示板への書き込みができません。
ごく一部のProxyサーバから書き込みを行うために、別サイトに専用のCGIを置いてあります。
詳しくは管理人まで、E-Mailでお問い合わせください。
_HTML_ exit; } ◆(3)おまけ 上記の方法では、IPアドレスのままなので、それをホスト名に変えるには.. 下記のようにします。 ただし、nslookは書き込み時のみ行うような工夫が必要です。 また、サーバによっては機能しません。 syb gethostに追加。 $host2 = &nslook($host2) if($host2=~/([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/); $host .="[$host2]" if($host2);#$host2があれば、$hostに追加。 return $host; }#gethost END sub nslook{ local($x)=@_; local($ip,$addr); if($x=~/([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/){ $ip="$1.$2.$3.$4"; $addr=(gethostbyaddr(pack('C4',$1,$2,$3,$4),2))[0]; if($addr ne ""){return $addr;}else{return $ip;} } return "$x"; }#nslook END ◆(4).htaccessによる対策 下記のような内容の.htaccessファイルを置いて特定のホストからのアクセスを禁止します。 --------------------------- order allow,deny allow from all deny from .aist-nara.ac.jp deny from .c2.net deny from sol.infonex.com --------------------------- ◆(5)CGIスクリプトを配布されている方へ。 ここで紹介しているサブルーチンは自由に移植してくださって結構です。 (もちろん、私のHPへのリンクとかは歓迎しますけどぉ...) IP取得方法を改良された方は是非連絡くださいませ。 Name Yui Suzuki MailAddres yui@cup.com HomePage http://www.cup.com/yui/