JeffreyFrancesco.org 公開日 タグ Tag Permalink 現在地 Facebook page Twitter RSS feed

前回書いたように修正しておけば、とりあえず謎な文字化けは回避できるけど、トラックバックが有効にしてあるサイトなどでは、トラックバック元の文字コードが UTF-8 じゃなければ文字化けが発生しますし、普通に個別ページからコメントする分にはまず問題ないけどそうじゃない場合もある (悪意でわざと文字コードを変えてコメント投稿をされるなど)ので、それに対しては我々の方で対策してやる必要があります。

feedback プラグインのコードを読んでみると、受け取ったコメントやトラックバックのサニタイズ処理を行なっているのは save_feedbacksave_preview の2つのサブルーチンで、それぞれ1157行目と1216行目で:

    $value = escapeHTML($value);

とやってるだけなので、この部分に文字コード判別と変換の処理を加えておきます (ちなみにこの部分は前回書いた通り、自前の escape_HTML サブルーチンで処理するように変更します)。という訳で、変更後の save_feedbacksave_preview サブルーチンの該当部分は:

    my $charset = getcode(\$value);
    $value = Jcode->new(\$value, $charset)->utf8
        if $charset and $charset !~ /^(ascii|utf8)$/;
    $value = escape_HTML($value);

という風に変更しました。始めに getcode で判別した文字コードを変数 $charset に格納した後、$charset があって (つまり undef でない) かつ ascii utf8 以外の時にのみ、Jcode で UTF-8 に変換、その後 escape_HTML してサニタイズ処理を行なう、という具合です。

SuiteX サーバには Perl 5.8.7 がインストールされているので Encode モジュールを使っても良いんでしょうが、UTF-8 フラグが今一理解できてない頃に修正したので、Jcode モジュールを使ってます。まあどちらもインストールされているのですが。

次回は Akismet によるスパム対策の有効化について書く予定です。