blog.鶯梭庵

二〇〇四年 師走 卅日 木曜日

スパムコメント対策

このブログを作るに当たって、blosxom で作られたブログをいくつか見たのだけれど、スパムコメントが結構書き込まれていた。そこで、立ち上げたときにはコメント機能を外していて、コメントが書き込まれたらメールで知らせてくれる機能を追加してからコメントが書き込めるようにしたのだが、すぐにスパムコメントが来た。いったいどこから嗅ぎつけてくるのやら。

はじめは、手動でスパムコメントを消していたが、それを毎日するのも面倒なので、以下の対策をしたところ、スパムコメントがなくなった。


データの読み込みには、CGI モジュールを使っている。

use CGI ':cgi';
$CGI::POST_MAX = 1024 * 4;
my $error = cgi_error;

こうすると、4KB より大きなデータが送られてきたとき、そのデータは捨てられて、$error にエラーメッセージがセットされる。送られてきたデータが空だったとき、$errortrue だったら、データが大きすぎたということだし、$errorfalse であれば、もとから空だったということが分かる。4KB というのは甘い制限のような気もするが、ある程度長い書き込みでも、まともな内容なら受け付けたい。


次に、それぞれの項目について、以下の正規表現にマッチするかどうか調べて、マッチしたら書き込まない。

m{<[a-z/!].*>}is

コメントに HTML タグが含まれていれば、これに引っかかる。HTML じゃなくても引っかかる可能性はあるが、現実的には問題にならないだろう。私のところにあったスパムコメントは、いかがわしいサイトへのリンクを含んだ HTML だったので、これでスパムが止まった。


次に HTML 特殊文字のエスケープ。HTML エンティティの入力は受け付けるようにした。

s/&/&amp;/g;
s/&amp;([a-z]\w+);/&$1;/ig;
s/&amp;(#\d+);/&$1;/g;
s/</&lt;/g;
s/>/&gt;/g;
s/"/&quot;/g;

最後に、改行文字の処理をする。これについては、OHZAKI さんのperlメモに詳しい解説がある。

コメントを書くには JavaScript が必要です。

二〇〇四年 神無月 卅一日 日曜日

Safari のいいこと見つけた。

perl などを使って動的に生成されるウェブページを作っているときは、画面上で意図通り表示されるかだけを見るのではなく、出力される HTML ソースが意図通りであるかを見た方がいい。ブラウザが違うと画面上の見え方は変わるが、HTML ソースはサーバ側の設定を変えないかぎり一定だから。

そういうわけで、開発中は、ブラウザの HTML ソース表示機能を使って、HTML ソースを見ながらページを作っていくわけだけれど、Safari では、ソースを表示したまま、スクリプトを変更してページの再読み込みをしたり、フォームの送信をしたりすると、ソースがリアルタイムで更新される。これは便利。

ちなみに、HTTP ヘッダが正しく送られているかどうかを確認するには、シイラを使うとよい。HTML ソース表示画面で、HTTP ヘッダも見れる。

コメントを書くには JavaScript が必要です。

二〇〇四年 長月 廿八日 火曜日

メールアドレスに何となくマッチする正規表現

このブログでは使っていないけれど、他で使う用事があったので、入力された文字列が正当なメールアドレスかどうか何となく判定する正規表現を考えてみた。

m/^[--9^-~#-'!*+=?]+@([-a-z0-9]+\.)+[a-z]{2,4}$/i

これにマッチすれば「何となく」正当なメールアドレス。これにマッチしなかったら「何となく」不正なメールアドレス。これにマッチしない正当なメールアドレスもあれば、これにマッチする不正なメールアドレスもあるが、実用的には十分と思う。

正確にマッチさせたい場合は、OHZAKI さんのperlメモを読むこと。

なお、いうまでもないことだけれど、正当なアドレスであることと、実際に使われているアドレスであることとはまったく別。アドレスが実際に使われているかどうかは、実際にメールを出して、返信があるかどうかを確かめるしかないと思う。

以上の点をふまえた上で、コピーして使いたい人はご自由にどうぞ。何か問題が起こっても、責任は取りません。


2004年9月29日追記 上記正規表現にマッチしない正当なメールアドレスは hatori(@origami)koshiro@ousaan.com とか "Hatori, Koshiro"@ousaan.com とか。こういうアドレスを使っている人は見たことないけど。

上記正規表現にマッチする不正なメールアドレスは Hatori.Koshiro.@ousaan.com とか。ただし、これは不正であるにもかかわらず、DoCoMo では使えるらしい。

ちなみに、これらのメールアドレスはすべて架空のアドレス。送っても届きません。


2004年11月1日追記 よくよく調べてみたら、「.museum」というトップレベルドメインがあった。そのうち「.travel」という TLD も新設されるらしいし、上の正規表現はこう直した方がいい。

m/^[--9^-~#-'!*+=?]+@([-a-z0-9]+\.)+[a-z]{2,6}$/i

コメントを書くには JavaScript が必要です。

二〇〇四年 長月 廿六日 日曜日

日付を漢字表示にする

8月29日の記事日付を漢字表示にするにはの改良版。タイムスタンプを受け取って、漢字表記の日付を返すサブルーチン。コピーして使いたい方はご自由にどうぞ。

my ($time) = @_;
my ($date, $month, $year, $day) = (localtime $time)[3..6];
my @month = qw( 睦月 如月 弥生 卯月 皐月 水無月 文月 葉月 長月 神無月 霜月 師走 );
my @day = qw( 日 月 火 水 木 金 土 );
my @num = qw( 〇 一 二 三 四 五 六 七 八 九 );
my @d_num = qw( 〇 十 廿 卅 );
my @date = split "", $date;
my $date1 = shift @date if @date == 2;
my $date2 = shift @date;
$date = $year+1900;
$date =~ s/(\d)/$num[$1]/g;
$date .= "年 $month[$month] ";
$date .= $d_num[$date1] if $date1;
$date .= $num[$date2] if $date2;
$date .= "日 $day[$day]曜日";
return $date;

コメントを書くには JavaScript が必要です。