Perlで全角文字のチェック

1.海外からの掲示板荒らし
今年 4月頃から、私のHPの掲示板に突然海外からと思われる書込みが繰り返されるようになりました。おぉ、私のページも ついに海外からも注目されるようになったんだ・・・って、喜んでる場合ではありません。ガイジンの誰が日本語だけの私のページを見に来るかって!?
中身は一見して即それと分かるアヤしい薬のことやアダルト系などのHPのURLのリンクを書き込んであるので、クリックしたらそれなりのページに飛んでしまうと思われます(クリックしていないので確信はありませんが)

2.とりあえず
1年に 何度かと言うくらいしか書込みのない暇な掲示板ですが、ほぼ毎日 2-3件の書込みがされるため、消すのが結構億劫です。仕方ないので、とりあえず書込み内容を保存してあるログファイルのファイル名を1字だけ変えて、一旦エラーページを表示するようにして、そのエラーページに 新しいログファイル名を全角文字で掲載して、そのファイル名に変更してから再アクセスしてもらうようにしました。日本語フォントが実装してなければ(実装してあっても日本語が読めなければ)何を言っているのか、ファイル名も 全角文字なら文字化けして意味のない文字列で表示されるはずですから、不正アクセスは遮断できるだろうと想像しました。1週間ほど様子を見ましたが、荒らしは起きませんでした。

3.対策
しかしこのままですと、URL欄を一旦書き換えてもらう必要があるので、単にリードオンリーの人には面倒です。で、どうしようかと悩んだんですが、方法として 私のページですから海外からの書込みは考えられないので、書き込まれた文章に漢字や平仮名が使われていなければエラーにしてしまえば良いだろうと言うことで、掲示板用のCGIプログラムに全角文字判定処理を入れることにしました。
しかし、CGIプログラムの Perl言語は 1-2年さわっていません。文法を思いだし思いだし、Webで検索しながら、何とか 漢字とASCII文字などを判定する処理を考えました。
ほとんどは、 大崎 博基 さんという方のこのページに詳しく書かれております。 他のページにも S-JISコードのままで判定するルーチンが掲載されていたりしますが、実験すると何故か誤判定するときがあったりします。例えば正規表現の中で文字クラスを指定するのに [ぁ-ん]とかしますが、Windows上では問題ないものの、このままだとUNIXではサーバーエラーになってしまい、"-"の両側に半角スペースを入れると判定できたりします。Win/Unixでは取り扱っている文字コードが異なっているので当然と言えば当然なんですが、実際にどのようにコーディングすればいいのか(例えば16進の文字コードを文字クラスの中にどのように記述するのかとか)分かりませんでしたが、上記のHPの説明を読めば明快です。で、一応 TeraPad でテストするために こんなテストプログラムを作ったりしてみました。
エディタのTeraPadのプラグインTpPerlで実行するとこんな感じで実行できました。
perl.gif
上の画面では、半角・全角の文字数も正しくカウントされ、全角文字(漢字・カタカナ・ひらがな・数字) と、半角カタカナと、それ以外のASCII文字が区別出来ています。
で、結果的にはこんな処理を元々のBBS用のCGIプログラムに埋め込みました。
ま、日本語の分かる人間がいたら効果はありませんが、当面は何とかいたずらでは書き込まれていません。しかし、いやな世の中です。他人を利用して善悪の見境なく稼ごうとする人たちにいつも狙われてしまい、防御をしないと自分ばかりか自分の周りの人たちまで巻き込んでしまうことになります。


NAME.gif 総アクセス数