二〇〇四年 師走 卅日 木曜日■ スパムコメント対策 [/this_blog/perl]この記事は書かれてから1年以上経過しています。内容が古くなっている可能性があります。コメントの受付は終了しました。 このブログを作るに当たって、blosxom で作られたブログをいくつか見たのだけれど、スパムコメントが結構書き込まれていた。そこで、立ち上げたときにはコメント機能を外していて、コメントが書き込まれたらメールで知らせてくれる機能を追加してからコメントが書き込めるようにしたのだが、すぐにスパムコメントが来た。いったいどこから嗅ぎつけてくるのやら。 はじめは、手動でスパムコメントを消していたが、それを毎日するのも面倒なので、以下の対策をしたところ、スパムコメントがなくなった。 データの読み込みには、CGI モジュールを使っている。 use CGI ':cgi'; $CGI::POST_MAX = 1024 * 4; my $error = cgi_error; こうすると、4KB より大きなデータが送られてきたとき、そのデータは捨てられて、$error にエラーメッセージがセットされる。送られてきたデータが空だったとき、$error が true だったら、データが大きすぎたということだし、$error が false であれば、もとから空だったということが分かる。4KB というのは甘い制限のような気もするが、ある程度長い書き込みでも、まともな内容なら受け付けたい。 次に、それぞれの項目について、以下の正規表現にマッチするかどうか調べて、マッチしたら書き込まない。 m{<[a-z/!].*>}is コメントに HTML タグが含まれていれば、これに引っかかる。HTML じゃなくても引っかかる可能性はあるが、現実的には問題にならないだろう。私のところにあったスパムコメントは、いかがわしいサイトへのリンクを含んだ HTML だったので、これでスパムが止まった。 次に HTML 特殊文字のエスケープ。HTML エンティティの入力は受け付けるようにした。 s/&/&/g; s/&([a-z]\w+);/&$1;/ig; s/&(#\d+);/&$1;/g; s/</</g; s/>/>/g; s/"/"/g; 最後に、改行文字の処理をする。これについては、OHZAKI さんの perlメモに詳しい解説がある。 [この記事だけを読む。] [最新の記事を読む。] 二〇〇四年 神無月 卅一日 日曜日■ Safari のいいこと見つけた。 [/this_blog/perl]この記事は書かれてから1年以上経過しています。内容が古くなっている可能性があります。コメントの受付は終了しました。 perl などを使って動的に生成されるウェブページを作っているときは、画面上で意図通り表示されるかだけを見るのではなく、出力される HTML ソースが意図通りであるかを見た方がいい。ブラウザが違うと画面上の見え方は変わるが、HTML ソースはサーバ側の設定を変えないかぎり一定だから。 そういうわけで、開発中は、ブラウザの HTML ソース表示機能を使って、HTML ソースを見ながらページを作っていくわけだけれど、Safari では、ソースを表示したまま、スクリプトを変更してページの再読み込みをしたり、フォームの送信をしたりすると、ソースがリアルタイムで更新される。これは便利。 ちなみに、HTTP ヘッダが正しく送られているかどうかを確認するには、シイラを使うとよい。HTML ソース表示画面で、HTTP ヘッダも見れる。 [この記事だけを読む。] [最新の記事を読む。] 二〇〇四年 長月 廿八日 火曜日■ メールアドレスに何となくマッチする正規表現 [/this_blog/perl]この記事は書かれてから1年以上経過しています。内容が古くなっている可能性があります。コメントの受付は終了しました。 このブログでは使っていないけれど、他で使う用事があったので、入力された文字列が正当なメールアドレスかどうか何となく判定する正規表現を考えてみた。 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 [この記事だけを読む。] [最新の記事を読む。] 二〇〇四年 長月 廿六日 日曜日■ 日付を漢字表示にする [/this_blog/perl]この記事は書かれてから1年以上経過しています。内容が古くなっている可能性があります。コメントの受付は終了しました。 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; 関連記事: ・split 関数についてのメモ [this_blog/perl] [この記事だけを読む。] [最新の記事を読む。] |
カテゴリ
[/language] (98) 最新記事
◇ パスワードについてのあなたの常識はもはや非常識かもしれない・その1 [/links] |