[Goju関連] [スタッフ]
[お出掛け]
[独り言]
[雑談]
[独り言]
[Web関連]
[Web関連]
[Web関連]
[Web関連]
[Goju関連]
[Goju関連]
[グッズ]
[お出掛け]
[独り言]
[Goju関連]
[独り言]
[独り言]
[雑談] [Goju関連]
[独り言]
[スタッフ] [独り言]
System time 0.023438
マスターの独り言
<< スパム対策(その3) | スパム対策(その2) >> |
- スパム対策(その2:追加)
-
【2007/01/30(火)】
[Web関連]
先日書いた、スパムクローラーに対する掲示板のメールアドレス対策ですが、お間抜けな事に不十分である事が分りました(^-^;
実はGojuで使用している『KENT-WEB』さんのYY-BOARDv4.5だと前回の処置だけでは「過去ログ」から生のメールアドレスが見れてしまうのです。
「過去ログ」は通常の表示用サブルーチン(sub html_log{})とは別のサブルーチン(sub past{})で処理されてますので、そちらも対策してやらなければならなかったと言う訳でして・・・。
ただ、過去ログのデータは通常表示用のデータと異なりhtmlタグが記述されていて、sub past{}内でデータをそのままprintしていますから少し工夫が必要になってきます。
で、一々処理するのも面倒なので、javascriptでメールアドレスを再変換させる為のライブラリ(mail_convert.pl)を作りました。メールアドレスと名前(なくても可)を渡せば、javascript化してリターンされるものです。掲示板だけでなく他のcgiでも利用することが出来ますので、使って見たい方は下記をクリックしてダウンロードしてください。
mail_convert.pl ver0.0.1lzhファイルにしてあるので、適当な解凍ソフトで展開してください。展開して出来たmail_convert.plをテキストエディタで開けば使い方が載っています。
【追記(2007/03/03)】
上記バージョンにはスタイルシートが出力しないバグがありました。
修正したものを下記に置いておきます。で、掲示板の方ですが、前回記述した部分(sub html_log{}内)は次のようになります。もちろん、yybbs.cgiで事前にmail_convert.plをrequireしておく必要があります。
#-- メールアドレスのスパム対策
if( $mail ){ $name = &MLCON::convert($mail, $name, '', 0); }検索サブルーチン(sub find{})内も念のために同じようにしておきます。
sub find{
#・・・・・(中略)・・・・・#
foreach ($page .. $page_end) {
($no,$reno,$date,$name,$email,$sub,$com,$url)
= split(/<>/, $new[$_]);
if ($email) { $name = &MLCON::convert($email, $name, '', 0); }
if ($url) { $url = "<<a href=\"http://$url\" target='_top'>HOME</a>>"; }if ($reno) { $no = "$renoへのレス"; }
# 結果を表示
print "<hr>[<b>$no</b>] <font color=\"$sub_color\"><b>$sub</b></font>";
print " 投稿者:<b>$name</b> <small>投稿日:$date</small> $url<br>\n";
print "<blockquote>$com</blockquote>\n";
}#・・・・・(中略)・・・・・#
}過去ログのデータにはメールアドレスが直接タグ(<a href="maileto:〜">)で記述されている為、表示サブルーチン(sub past{})内の処理は次のようにします。
sub past{
#・・・・・(中略)・・・・・#
#-- 過去ログ検索部
# 表示開始
foreach ($page .. $page_end) {
$new[$_] =~ s/<a href="?mailto:([^">]+)"?>([^<]+)<\/a>/&MLCON::convert($1, $2, '', 0)/egi;
print $new[$_];
}#・・・・・・・(中略)・・・・・・・・#
# ページ区切り処理
$start = $page + 1;
$end = $page + $p_log;$i=0;
open(IN,"$file") || &error("Open Error : $file");
while (<IN>) {
$flag=0;
if ($_ =~ /^\<hr\>\[\d+\]/) { $flag=1; $i++; }
if ($i < $start) { next; }
if ($i > $end) { last; }if ($flag) {
$_ =~ s/<a href="?mailto:([^">]+)"?>([^<]+)<\/a>/&MLCON::convert($1, $2, '', 0)/egi;
print $_;
}
else {
$_ =~ s/<hr>//ig;
$_ =~ s/<a href="?mailto:([^">]+)"?>([^<]+)<\/a>/&MLCON::convert($1, $2, '', 0)/egi;
print "<blockquote>$_</blockquote>\n";
}
}
close(IN);#・・・・・(中略)・・・・・#
}
メールアドレスを再変換する為のjavascriptは次のようにすることでロードされます。
$java = &MLCON::load_java;
本来ならばこの$javaをsub header{}内でprintすればOKなのですが、YY-BOARDv4.5ではこの方法が使えません。
mail_convert.plでは再変換する為のjavascriptが3つ(実質は2)あり、メールアドレスが一つも無かった場合は何も出力しない仕様になっています。その為、メールアドレスをコンバートした【後】に呼び出す必要があるのですが、YY-BOARDv4.5ではヘッダーを出力した後に順次print処理されるのでそのままでは再変換用javascriptの出力がファイルの最後の方に来てしまいます。
変換されたメールアドレスはブラウザに読み込まれたと同時に再変換用javascriptを呼び出すため、再変換用javasciptが先に読み込まれていなければエラーとなってしまうのです。
ということで、ちょっとベタですが、メールアドレスがあろうがなかろうが再変換用javascriptを出力する事にして、sub_header{}内に次のように記述しました。
print <<"__END_OF_SCRIPT__";
$MLCON::JAVA[0]
$MLCON::JAVA[1]
$MLCON::JAVA[2]__END_OF_SCRIPT__
これで、通常表示も過去ログもクローラー対策を施したことになったわけです(多分)
<つづく>
最終更新日:2008/07/30(水) 16:39:20
Posted by マスター
posted by マスター
posted by じゅんじゅん
posted by マスター
posted by じゅんじゅん
posted by jp3brx