□Perl 講座 特別編 > タグの使用禁止

◆荒らし対策を考えて

今のままでは、書き込み内で自由にタグの利用が可能です。勿論、タグを利用したい方はそのままでいいのですが、タグが自由に書き込めると言うことはあらされる可能性が大きいのは事実です。
タグを使えなくなるようにすることによって、タグの閉じ忘れや、故意の悪戯等のレイアウトの破壊などを防ぐことが出来ます。ここでは、全てのタグの利用を禁止する方法をご紹介いたします。



◆タグ禁止ルーチン追加

まず、タグとはどういう法則で記述されているかを考えます。結論から言うと『<』と『>』で囲まれた部分ですよね。ですから、『<』と『>』を単純に他の文字と差し替えてしまえば良いのです。差し替える方法として、他の文字に置換するか?削除してしまうか?になるわけですが、ここで特殊文字を用いれるのが一番理想的だと思います。
そして、置換するルーチンを挿入する箇所ですが、書き込みが行われる時にタグの制御をしたいわけですから、サブルーチンwriteか、サブルーチンdecodeに挿入可能になります。ここで、どちらが良いか?はそのプログラムにもよりますが、サブルーチンdecodeに挿入した方が多様性に富むので、こちらに挿入しましょう。

#デコードするためのプログラム
sub decode {

    # プラウザからのデータ取込み
    if ($ENV{'REQUEST_METHOD'} eq "POST") {
        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    }
    else {
        $buffer = $ENV{'QUERY_STRING'};
    }

    # プラウザからのデータ変換
    @pairs = split(/&/,$buffer);
    foreach $pair (@pairs) {
        #1行毎に$name,$valueを取り出す
        ($name, $value) = split(/=/, $pair);
        # 変換演算子 tr + を スペースに置き換え
        $value =~ tr/+/ /;
        # 変換演算子 s/// 単語の構成文字にマッチ
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

        # " を &quot; に変換
        $value =~ s/"/&quot;/g;
        #\n を "" に変換
        $value =~ s/\n//g;
        #< を &lt; に変換
        $value =~ s/</&lt;/g;
        #> を &gt; に変換
        $value =~ s/>/&gt;/g;



        # 日本語に変換(デコード処理部分)
        &jcode'convert(*value,'sjis');
        &jcode'convert(*name,'sjis');
        $FORM{$name} = $value;
        if ($name eq 'url') {
            $FORM{$name} =~ s/http:\/\///g;
        }
    }
}

以上の4行をサブルーチンdecode内に挿入するだけで、このプログラムの場合OKです。何か一つの処理を加えようとしたときに、物凄く大変な処理をしなければならないのでは?と思われがちですが、こういった小さな処理ひとつひとつを理解、積み重ねることによって大きなプログラムを形成されているので、ちょっとした変更・追加でしたら容易に出来るのです。

□特別編 一緒に簡易掲示板を作ってみよう