PHP5.3.6からPDOの文字エンコーディング指定が可能となったがWindows版では不具合にまつわる件
PHP 5.3.6以降では PDO/MySQLのDSNでのcharset指定が有効になったようです. (MySQL 4.1.11以降, MySQL 5.0.7以降, もしくはMySQLNDを利用している場合)
2011-03-18 09:03:07【中間報告】Windows環境でPHP5.3.6のPDO/MySQLの検証中。接続文字列での文字エンコーディング指定は有効になるも、set namesで指定したのと同じ挙動のように見える。Shift_JISの場合、0x5CによるSQLインジェクションができる。引き続き検証する
2011-03-19 11:38:18【続き】Windows環境でPHP5.3.6のPDO/MySQLの検証。ログイン時に文字コードを指定されていることをネットワークキャプチャで確認。SQLインジェクションがおこる理由は調査中。PDO内のエスケープの不備か
2011-03-19 16:13:21@s_hskz 関連あります。PDOの問題は、静的プレースホルダがデフォルトで使われないことと、文字エンコーディングが指定する方法がないことの2点によりSQLインジェクション脆弱性が混入するもので、そのうちの前者に該当します。僕がいま調べているのは後者です
2011-03-19 16:43:59PDOの件は、mysql_set_character_setじゃなくてmysql_optionsを使うように開発途中で変えてるぽいんだけどそれだと http://goo.gl/hJsYA の問題がおこるよねーって話じゃないかなぁと
2011-03-19 23:01:38でも @ockeghem さんがログイン時に文字コードが送られていると言っておられるので違うかなぁ。まぁコミットログしかみてないで発言してますがw
2011-03-19 23:05:18Linux上のPHP5.3.6のPDO/MySQLでの検証ですが、期待通りに動いているようです。こちらは、Shift_JISの0x5CによるSQLインジェクションはできなくなりました。
2011-03-20 01:49:03PHP5.3.6のPDO/MySQLずっと調べていましたが、1)Linuxでは正しく動いているよう、2)Windowsでは文字エンコーディングの変換などはしてくれるが、エスケープ時に文字エンコーディングを考慮していないよう…これは脆弱性、というのが結論
2011-03-21 12:56:10@nihen ソースをgrepすると、たしかにmysql_optionsを使っていますね。mysql_set_character_setは使ってないようです
2011-03-21 17:33:35@haruyama 環境の問題を疑い、MySQL5.5とPHP5.3.6をクリーンインストールしてみましたが、現象は変わらないので、Windows版PHP5.3.6の問題だと思います
2011-03-21 23:09:22日記書いた / PHP5.3.6からPDOの文字エンコーディング指定が可能となったがWindows版では不具合(脆弱性)あり - 徳丸浩の日記 http://htn.to/hN8TLN
2011-03-22 10:10:29@ockeghem ちなみに、「データベース接続時の文字エンコーディング指定」てのは"SET NAMES sjis"ですか?
2011-03-22 11:08:24@nihen いいえ、パケットキャプチャしてもSET NAMESは流れていません。ログイン時のリクエストに文字エンコーディング 13 と指定されています。Latin1やUTF-8に変えると、該当のコードに変わるので間違いないと思います
2011-03-22 11:15:07@nihen はいそうです。キャプチャのハードコピーとっとけばよかったのですが、細切れの時間使ってやってたので今回は記録していません
2011-03-22 11:23:25ここの330行目w。213行目と比べると分かりやすい http://svn.php.net/viewvc/php/php-src/trunk/ext/mysqlnd/mysqlnd_charset.c?view=markup
2011-03-28 16:22:44windows-phpの用意されているバイナリではmysqlndがデフォルトで使われてるぽいけどmysqlndはまだ信頼できないつーことすねぇ
2011-03-28 16:25:20とりあえずmysqlndのsjisで困る人は、cp932を代わりに使うといいとおもいます。PDOでもcharset=cp932にするとおkです。
2011-03-28 16:32:32@nihen あー、これは酷いですね。テストしていない? でも原因が判明したので、僕のテストが間違ってなかったことも分かって安心したりしてw
2011-03-28 17:46:18まぁ、結果を分かっているから「これは酷い」となるんだけど、予断なしにソース見て気づくかというと難しいだろうな。だからこそテストというものをするわけで
2011-03-28 17:51:01あーちなみにPDOの件のmysql_set_character_setじゃないと駄目なんじゃないのーというのは間違いでした。ログイン時のパケットにcharacter setのコードが送られるから。
2011-03-28 23:09:48