ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

文字エンコーディングをmb_check_encoding()でしようとしたらmbstring.substitute_characterとかmbstring.encoding_translationを設定していた為にうまく動かなくて少し嵌ったのでメモ。

基本的にmbstringモジュールが無い環境を想定しているYakiBikiですが、入っていればちゃんと文字エンコーディングのチェックをしておきたいなぁとずっと思ってまして、入れたのですが。
昔設定した mbstring.substitute_character とか、mbstring.encoding_translation が On になっていたりで、不正な文字を入力させてみても mb_check_encoding() がいつもtrueを返してきたので焦りました。

まず基本方針としてはコレを見ました。
・「これからのプログラムの作り方 - 文字エンコーディング検証は必須」
http://blog.ohgaki.net/a_a_a_a_a_ra_ca_a_oa_pa_fa_ma_sa_sa_raf

ところが、コードを組み込んで適当なバイナリをGETパラメータとかに渡しても通ってしまう。・・・何故?と暫く嵌ったのですが。
エンコードチェックの関数、mb_check_encoding効かなかったりってあるのかな?
http://d.hatena.ne.jp/elseif/20080501/1209661912
→この記事に救われました。
で、mbstring.substitute_characterの設定を外してみたのですがそれでも駄目。もしやencoding_translationがOnだと駄目?とググってみたら・・・
・「[PHP-dev 1344] Re: mb_check_encoding() のテスト」
http://ml.php.gr.jp/pipermail/php-dev/2006-October/001345.html
→というわけで、encoding_translationをOffにしてようやくちゃんと、不正な文字列を弾くようになってくれました。

mb_check_encoding()による文字コードチェックを入れたら、必ず不正な文字列をHTTP経由でちゃんと外部から与えて、弾いてくれるか確認しないと怖いですね。mbstringの実行時設定が絡むので。