C/C++に文字エンコーディングバリデーション機能がないって、ほんと?
通りすがり (2009-09-16 18:09)
> PHP以外の言語は「(略)」のに対し
PHP以外では: 既にあたり前になりつつある文字エンコーディングバリデーション - 徳丸浩の日記(2009-09-14)
ここに挙げられている言語がWebアプリで使われる全ての言語ではない。
例えば、CやC++にはない。付け足せば、PHPやPerlなどのCモジュール内部で起こった不正な文字はスルーされうる。
よって、「Perl、Java、.NET、Ruby、PHPの中では」と書けば筋は通るが、「PHP以外では」は誤り。
そしてそんなことを、PHPの(脆弱性撲滅に注力している)開発者に言ったら、喧嘩を売られたと受け止められて当然。
というコメントが気になった。
C言語にある文字コード変換機能って言ったら mbtowc だと思うけど、mbtowc は無効なバイト列を受け取ると EILSEQ を返すことになっている。少なくとも OSX 10.5.8, FreeBSD 6.3, CentOS 5 では、"\xc0\xaf" を渡すと、ちゃんと EILSEQ を返す。
$ C -ilocale.h -istdlib.h -cWall -e 'wchar_t wc; printf("%s\n", setlocale(LC_ALL, "ja_JP.UTF-8")); printf("%d\n", mbtowc(&wc, "\xc0\xaf", 2)); perror("")' ja_JP.UTF-8 -1 無効または不完全なマルチバイトまたはワイド文字です
mbtowc よりも実際によく使われる ICU みたいなライブラリにも、無効なバイト列を弾く機能はある (というか、PHP6 からは ICU を使って文字コード変換するんですよね)。
というわけで、(文字エンコーディングバリデーション機能が)「CやC++にはない」という「通りすがり」さんの指摘は誤り。そんなことをCの(文字コード変換ライブラリを作っているor使っている)開発者に言ったら、喧嘩を売られたと受け止められて当然。
... なんじゃないかなーと思った。