« 詐欺かな - 「出会い系サイトを運営しませんか?」メールDojo Javascript Toolkit »

4 comments

Comment from: Yasuo Ohgaki [Member] Email · http://www.ohgaki.net/
このエントリ、随分前(1月くらいだったかな?)から書かなければ、と思いつつ先延ばしにしていたのですがやっと書きました。状況が整うまで結構時間がかかりました。実はWebアプリセキュリティ入門にも書き入れられる時期には文字エンコーディングの妥当性チェックは必須であることは理解していたのですが、出版される頃にはまだ状況が整っていないのが分かっていたのであえて書いていなかったりします。抜け駆けして書いていれば千冊くらいは余分に売れたかも?! 改訂版が出るのであれば追記しますが、改訂版は無いと思われます...

mb_check_encoding($str, 'auto')が通るのはバグというより仕様かな? passは無意味なのでエラーで良いと思います。自分は使わないと思いますがautoはエンコーディングリストの順番に検証してOKかNGか知りたい、というケースはあるでしょう。多分。

日本語のWebアプリケーションには壊れた文字エンコーディングで致命的なセキュリティ問題を引き起こす場合が多くある為、ある程度準備が整うまではあまり広く公開できないのが困ったものです。この件はPostgreSQLプロジェクトの方でCVEが作成されていて対処には結構時間をかけて行っていました。詳しくは石井さんのITProの記事を参考にしてください。

それからiconvは実装によって異なるのは有名(?)です。使う場合はその辺りを理解してから使った方が良いと思います。

Unicodeの問題には正規化の問題もあったり、UTFには同じ文字でも別の表記(エンコーディング)ができる問題、BOM(Byte Order Mark)の問題、Endianの問題などがあるので結構面倒です。というよりこんな仕様にした(なった)のは...と言いたくなります が、仕方無いですね。この為にmb_check_encoding()を追加する必要もあったと言えます。文字コード・文字エンコーディングは勝手にいろいろしてしまう携帯キャリアもあったり、何でもありの世界になっていますね。

2006/06/13 @ 04:38
Comment from: ねこまんま [Visitor]
何時もこちらで勉強させてもらっている者です。
POSTに空文字があった場合、
mb_convert_encoding($val, $encoding, $encoding);
がfalseになりtrigger_errorしてしまわないでしょうか。フォームで入力必須でないテキストフィールドを使う場合にと。
2008/06/09 @ 14:46
Comment from: Yasuo Ohgaki [Member] Email · http://www.ohgaki.net/
> falseになりtrigger_errorしてしまわないでしょうか。フォームで入力必須でないテキストフィールドを使う場合にと。

空の文字列であっても正しい文字エンコーディングなので問題は発生しないはずです。何か問題が発生しているのでしょうか? mbstringモジュール自体がロードされているかチェックしていないのでmb_check_encodingが無いとエラーになります。

いつでもコレが使えるかというとバイナリをURLエンコードしている場合などでは使えません。BASE64等を利用するか、除外できるようにカスタマイズが必要です。
2008/06/10 @ 23:43
Comment from: ねこまんま [Visitor]
すみません、サーバが普段使っているものでなかったことをすっかり忘れていました。レンタルサーバでPHP4.3.2でした(古いバージョンのことで恐縮です・・・)。mbstringモジュールは入っています。
このバージョンあたりのバグを含めて見直してみます。
2008/06/23 @ 16:31

Leave a comment


Your email address will not be revealed on this site.

Your URL will be displayed.
PoorExcellent
(Line breaks become <br />)
(Name, email & website)
(Allow users to contact you through a message form (your email will not be revealed.)