新たに制御用のファイル(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
EOF exit; }