前回書いたように修正しておけば、とりあえず謎な文字化けは回避できるけど、トラックバックが有効にしてあるサイトなどでは、トラックバック元の文字コードが UTF-8 じゃなければ文字化けが発生しますし、普通に個別ページからコメントする分にはまず問題ないけどそうじゃない場合もある (悪意でわざと文字コードを変えてコメント投稿をされるなど)ので、それに対しては我々の方で対策してやる必要があります。
feedback プラグインのコードを読んでみると、受け取ったコメントやトラックバックのサニタイズ処理を行なっているのは save_feedback
と save_preview
の2つのサブルーチンで、それぞれ1157行目と1216行目で:
$value = escapeHTML($value);
とやってるだけなので、この部分に文字コード判別と変換の処理を加えておきます (ちなみにこの部分は前回書いた通り、自前の escape_HTML
サブルーチンで処理するように変更します)。という訳で、変更後の save_feedback
と save_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 によるスパム対策の有効化について書く予定です。