Security

文字コードの問題

2009年11月3日

またまた、スクラッチから構築中。以前考えていた(そしてコードを挿入していた)さまざまな機能をとりあえず削除し、必要最低限のコードでどこまでできるかを考えている。かなりコードがすっきりしそう。例えば、新しい考え方では、コード中でのスキンとテンプレートの区別がまったく存在しない等(ただし、概念上の違いは存在)。

サポートする文字コードは、UTF-8のみにすることにした。これも、コードの簡潔化のため。その他、さまざまな規約を設けることで、簡潔なコードでの完成を目指す。今月は、Jeans月間かな?

で、表題の件。文字コードの問題は主に、XSS対策でのこと。2つ考え方があって、ひとつはJeansに入力される文字列をチェックする方法。もう一つは、出力するときにチェックする方法。

最初に書いたとおり、最初のバージョンではなるだけ全体のコードを簡潔にしたい。で、出力側にはhtmlspecialchars()を通すのだが、ここでUTF-8エンコード指定がどのように考慮されているのかを調べてみた。

<?php

show('試験の文章(SJIS)');
show('Alphabet only.');
ob_start();
show(mb_convert_encoding('試験の文章(UTF-8)','UTF-8','SJIS'));
echo mb_convert_encoding(ob_get_clean(),'SJIS','UTF-8');

function show($text){
    $text=htmlspecialchars($text,ENT_QUOTES,'UTF-8');
    echo "'$text'(".strlen($text).")";
    echo rawurlencode($text);
    echo "\n-----------------------\n";
}

Windowsのコンソールからこのコードを実行すると、次のようになる。

''(0)
-----------------------
'Alphabet only.'(14)Alphabet%20only.
-----------------------
'試験の文章(UTF-8)'(22)%E8%A9%A6%E9%A8%93%E3%81%AE%E6%96%87%E7%AB%A0%28UTF-8%29
-----------------------

SJISの文字列をUTF-8でhtmlspecialchars()に通すと、空の文字列が帰ってきた。とりあえず、最初のバージョンでは、出力側のチェックとして、htmlspecialchars()を通すだけでよさそうだ。

コメント

コメントはありません

コメント送信