文字コードの問題
2009年11月3日
またまた、スクラッチから構築中。以前考えていた(そしてコードを挿入していた)さまざまな機能をとりあえず削除し、必要最低限のコードでどこまでできるかを考えている。かなりコードがすっきりしそう。例えば、新しい考え方では、コード中でのスキンとテンプレートの区別がまったく存在しない等(ただし、概念上の違いは存在)。
サポートする文字コードは、UTF-8のみにすることにした。これも、コードの簡潔化のため。その他、さまざまな規約を設けることで、簡潔なコードでの完成を目指す。今月は、Jeans月間かな?
で、表題の件。文字コードの問題は主に、XSS対策でのこと。2つ考え方があって、ひとつはJeansに入力される文字列をチェックする方法。もう一つは、出力するときにチェックする方法。
最初に書いたとおり、最初のバージョンではなるだけ全体のコードを簡潔にしたい。で、出力側にはhtmlspecialchars()を通すのだが、ここでUTF-8エンコード指定がどのように考慮されているのかを調べてみた。
Windowsのコンソールからこのコードを実行すると、次のようになる。
SJISの文字列をUTF-8でhtmlspecialchars()に通すと、空の文字列が帰ってきた。とりあえず、最初のバージョンでは、出力側のチェックとして、htmlspecialchars()を通すだけでよさそうだ。
サポートする文字コードは、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()を通すだけでよさそうだ。