雑文発散

«前の日記(2008-05-15) 最新 次の日記(2008-05-17)» 編集
過去の日記

2008-05-16 [長年日記]

[PHP] CakePHP 1.2 の国際化機能についての考察

CakePHP1.2の簡単国際化」や「CakePHPで国際化の方法を試してみました」を参考にさせて頂き、CakePHP 1.2.x.x 先端で国際化っぽいことをしている。

オレがコーディングしている時にも、「〜試してみました」の記事と同じように View のテンプレート内で、

 <?php __('Hello World'); ?>

のように記載していたんだけど、実運用でこの記述方法をそのまま使うとよろしく無いかもしれないと気が付いた。

上記の場合、po ファイル内では次のような記述になる。

 msgid "Hello World"
 msgstr "こんにちは、世界"

__() 関数で指定した文字列が msgid となり、msgstr の部分に翻訳した文字列を入れる形式のファイルだ。

では、msgstr 部分に次のような文字列を入れたらどうなるだろう?

 msgid "Hello World"
 msgstr "こんにちは、世界<script>alert('オレは新世界の神になる!');</script>"

結果としては、アラートウインドウが開いて「オレは新世界の神になる!」と宣言されてしまう。

まぁ、実際のメッセージ内容に JavaScript を入れることはないだろうし、「<」やら「>」が出現するケースもそれほど高くないとは思う。

でも、こうやって翻訳用のファイルを別分けしている場合、開発者と翻訳者が同一人物とは限らない訳で、どういった文字列を入力されるかも分からない訳だ。したがって、開発者としては、どんな文字列が入力されたとしても正しく表示されるような気遣いをしておいたほうが良いのではないかと思う。

ということで、View のテンプレート内でメッセージ出力する場合は、

 <?php echo h(__('Hello World',true)); ?>

とするのが正しい、、、のかな?

最初の形に比べると、ちょっと美しくない書き方のようにも見えてしまうけど。。。ちなみに h() は、CakePHP の中で定義されている htmlspecialchars() 関数のエイリアス。