新たに制御用のファイル(NGnozomi.dat:パーミッションは600でいいと思います)を用意してください。
以下はbbs.cgiに追加する部分です。
# 設定 の一番最後に追加
# NGワード設定
# 0 : 無効
# 1 : 有効
$ngwordon = 1;
# NGワード
@ngword = (
'Very good site!',
'good site!',
'site!',
'I like it!',
'A href',
'削除依頼',
'ちょw',
'っw',
'wっ',
'ッw',
'wッ',
'w',
'http://www.douteikaimasu.com/',
);
# NGリファラ
@ngreferer = (
'2ch',
);
# NGURL
@ngurl = (
'2ch',
'http://www.douteikaimasu.com/',
);
# NGワード使用時の処理(1で指定、複数1にしても上から優先的に適応)
$shori1 = 1; #使用時の投稿が不可となるだけ
$shori2 = 0; #閲覧のみ、投稿不可のアクセス制限
$shori3 = 0; #閲覧投稿共に不可のアクセス制限(弾き)
# h抜くなよチャンコロ設定
# 0 : 無効
# 1 : 有効(強制的にhを付ける)
# 2 : 有効(NGワードにする。NGワードの設定を有効にしないと無効)
$hnukuna = 2;
# アクセス制御用ファイル名
$access_l = './NGnozomi.dat';
# 弾き先のURL(アクセス制御用)
$hajikiurl = 'http://www.google.co.jp/webhp';
# メッセージチェックの
# &chkerror ( 'フォームデータの一部に欠落があります。もう一度やり直して下さい。', 33 );
# } のあとに追加
# NGワードチェック
if ($ngwordon) {
if ( $hnukuna == 2 ) { push ( @ngword, '(?;
eval 'flock ( ACCS, 8 )';
close ( ACCS );
$acldel = 0;
for ( $i = 0 ; $i < @acldata ; $i++ ) {
$aflag = 0;
( $tphost, $tagent, $way, $cu, $period, $adate )
= split ( /\,/, $acldata[$i] );
$tphost =~ s/\0/\,/g;
$tagent =~ s/\0/\,/g;
$cu =~ s/\0/\,/g;
$adate =~ s/\n$//;
if($period == 1){$aclimit = 86400;}
if($period == 7){$aclimit = 604800;}
# 期限切れの除外
if ( ( $adate + $aclimit ) < $nowtime && $period ne 'forever' ) {
$acldata[$i] = '';
$acldel = 1;
# フラグチェック
} elsif ( $host =~ /$tphost/i || $tphost eq 'all' ) {
if ( $agent =~ /$tagent/i || $tagent eq 'all' ) {
$aflag = 1;
}
}
# フラグ実行
if($aflag == 1){
if($way == 0 && $FORM{'v'} && $FORM{'v'} ne ''){
$FORM{'v'} = '';
}elsif($way == 1){
print "Location: $hajikiurl\n\n";
exit;
}
}
}
if($acldel==1){
open ( ACCS, ">>$access_l" ) || &prterror ( 'ファイルの書き込みに失敗しました。' );
eval 'flock ( ACCS, 2 )';
truncate ( ACCS, 0 );
seek ( ACCS, 0, 0 );
print ACCS @cntdata;
close ( ACCS );
}
}
}
###############################################################################
# NG処理
###############################################################################
sub ng {
my ( $ngtype ) = $_[0];
if($ngtype eq 'ngreferer'){
$ngmessage = 'どこから来ましたかヽ(´∇`)ノ';
}elsif($ngtype eq 'ngword'){
$ngmessage = '投稿内容にNGワードがあるヽ(´∇`)ノ';
}elsif($ngtype eq 'ngurl'){
$ngmessage = '変なURLは男割りですよヽ(´∇`)ノ';
}
if($shori1){
$ngmessage2 = '以下の環境変数は保存してないぜ(`ー´)hehehe';
}elsif($shori2){
$ngmessage2 = '以下の環境変数の内REMOTE_HOSTが保存された(`ー´)もう投稿はできないぜhehehe';
}elsif($shori3){
$ngmessage2 = '以下の環境変数の内REMOTE_HOSTが保存された(`ー´)もう閲覧すらできないぜhehehe';
}
$addr = $ENV{'REMOTE_ADDR'};
$host = $ENV{'REMOTE_HOST'};
if ( $addr eq $host || !$host ) {
$host = gethostbyaddr ( pack ( 'C4', split ( /\./, $addr ) ), 2 ) || $addr;
}
$ENV{'REMOTE_HOST'} = $host;
if($shori2){
$tphost = quotemeta($ENV{'REMOTE_HOST'});
open ( ACADD, ">>$access_l" ) || &prterror ( 'ファイル読み込みに失敗しました' );
eval 'flock ( ACADD, 2 )';
$| = 1;
seek ( ACADD, 0, 2 );
print ACADD "$tphost\,all\,0\,\,7\,$nowtime\n";
eval 'flock ( ACADD, 8 )';
close ( ACADD );
}elsif($shori3){
$tphost = quotemeta($ENV{'REMOTE_HOST'});
open ( ACADD, ">>$access_l" ) || &prterror ( 'ファイル読み込みに失敗しました' );
eval 'flock ( ACADD, 2 )';
$| = 1;
seek ( ACADD, 0, 2 );
print ACADD "$tphost\,all\,1\,\,7\,$nowtime\n";
eval 'flock ( ACADD, 8 )';
close ( ACADD );
}
$proxyflg = 0;
$anonymous = 0;
if ( $ENV{'HTTP_CACHE_CONTROL'} ) { $proxyflg = 1; }
if ( $ENV{'HTTP_CACHE_INFO'} ) { $proxyflg += 2; }
if ( $ENV{'HTTP_CLIENT_IP'} ) { $proxyflg += 4; }
if ( $ENV{'HTTP_FORWARDED'} ) { $proxyflg += 8; }
if ( $ENV{'HTTP_FROM'} ) { $proxyflg += 16; }
if ( $ENV{'HTTP_PROXY_AUTHORIZATION'} ) { $proxyflg += 32; }
if ( $ENV{'HTTP_PROXY_CONNECTION'} ) { $proxyflg += 64; }
if ( $ENV{'HTTP_SP_HOST'} ) { $proxyflg += 128; }
if ( $ENV{'HTTP_VIA'} ) { $proxyflg += 256; }
if ( $ENV{'HTTP_X_FORWARDED_FOR'} ) { $proxyflg += 512; }
if ( $ENV{'HTTP_X_LOCKING'} ) { $proxyflg += 1024; }
if ( $agent =~ /cache|delegate|gateway|httpd|proxy|squid|www|via/i ) {
$proxyflg += 2048;
}
if ( $host =~ /cache|^dns|dummy|^ns|firewall|gate|keep|mail|^news|pop|proxy|smtp|w3|^web|www/i ) {
$proxyflg += 4096;
}
if ( $host eq $addr ) {
$proxyflg += 8192;
}
$realaddr = '';
$realhost = '';
if ( $proxyflg > 0 ) {
if ( $ENV{'HTTP_X_FORWARDED_FOR'} =~
s/^(\d+)\.(\d+)\.(\d+)\.(\d+).*/$1.$2.$3.$4/ ) {
$realaddr = "$1.$2.$3.$4";
} elsif ( $ENV{'HTTP_FORWARDED'} =~
s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) {
$realaddr = "$1.$2.$3.$4";
} elsif ( $ENV{'HTTP_VIA'} =~
s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) {
$realaddr = "$1.$2.$3.$4";
} elsif ( $ENV{'HTTP_CLIENT_IP'} =~
s/(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) {
$realaddr = "$1.$2.$3.$4";
} elsif ( $ENV{'HTTP_SP_HOST'} =~
s/(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) {
$realaddr = "$1.$2.$3.$4";
} elsif ( $ENV{'HTTP_FORWARDED'} =~ s/.*\sfor\s(.+)/$1/ ) {
$realhost = "$1";
} elsif ( $ENV{'HTTP_FROM'} =~ s/\-\@(.+)/$1/ ) {
$realhost = "$1";
}
if ( !$realaddr && $realhost ) {
$realpackaddr = gethostbyname ( $realhost );
( $a, $b, $c, $d ) = unpack ( 'C4', $realpackaddr );
$realaddr = "$a.$b.$c.$d";
}
if ( $realaddr && $realhost && $realaddr eq $realhost ) {
$realhost = gethostbyaddr ( pack ( 'C4', split ( /\./, $realaddr ) ), 2 );
}
if ( $realaddr && $realhost eq '' ) {
$realhost = gethostbyaddr ( pack ( 'C4', split ( /\./, $realaddr ) ), 2 );
}
}
if($realaddr ne ''){
$ENV{'REMOTE_ADDR'} = "$ENV{'REMOTE_ADDR'}\nrealaddr = $realaddr";
}
if($realhost ne ''){
$ENV{'REMOTE_HOST'} = "$ENV{'REMOTE_HOST'}\nrealhost = $realhost";
}
$i=0;
foreach ( keys %ENV ) {
$line[$i] = $_ . ' = ' . $ENV{$_} . "\n";
$i++;
}
@temp = sort @line;
print <
$bbstitle NGに引っかかっちゃったよ!
$body
$ngmessage
$ngmessage2
@temp