PHP5.3.6からPDOの文字エンコーディング指定が可能となったがWindows版では不具合にまつわる件

@ockeghemさんのエントリ http://www.tokumaru.org/d/20110322.html#p01 の前後の関連tweetをまとめますた。 結果的にはwindowsではなくmysqlndが問題てことかなと。 続きを読む
4
HARUYAMA Seigo @haruyama

PHP 5.3.6以降では PDO/MySQLのDSNでのcharset指定が有効になったようです. (MySQL 4.1.11以降, MySQL 5.0.7以降, もしくはMySQLNDを利用している場合)

2011-03-18 09:03:07
徳丸 浩 @ockeghem

【中間報告】Windows環境でPHP5.3.6のPDO/MySQLの検証中。接続文字列での文字エンコーディング指定は有効になるも、set namesで指定したのと同じ挙動のように見える。Shift_JISの場合、0x5CによるSQLインジェクションができる。引き続き検証する

2011-03-19 11:38:18
徳丸 浩 @ockeghem

【続き】Windows環境でPHP5.3.6のPDO/MySQLの検証。ログイン時に文字コードを指定されていることをネットワークキャプチャで確認。SQLインジェクションがおこる理由は調査中。PDO内のエスケープの不備か

2011-03-19 16:13:21
shs_kz @s_hskz

@ockeghem id:do_aki さんのhtn日記(20100221)と関連があります?

2011-03-19 16:22:03
徳丸 浩 @ockeghem

@s_hskz 関連あります。PDOの問題は、静的プレースホルダがデフォルトで使われないことと、文字エンコーディングが指定する方法がないことの2点によりSQLインジェクション脆弱性が混入するもので、そのうちの前者に該当します。僕がいま調べているのは後者です

2011-03-19 16:43:59
CHIBA Masahiro @nihen

PDOの件は、mysql_set_character_setじゃなくてmysql_optionsを使うように開発途中で変えてるぽいんだけどそれだと http://goo.gl/hJsYA の問題がおこるよねーって話じゃないかなぁと

2011-03-19 23:01:38
CHIBA Masahiro @nihen

でも @ockeghem さんがログイン時に文字コードが送られていると言っておられるので違うかなぁ。まぁコミットログしかみてないで発言してますがw

2011-03-19 23:05:18
徳丸 浩 @ockeghem

Linux上のPHP5.3.6のPDO/MySQLでの検証ですが、期待通りに動いているようです。こちらは、Shift_JISの0x5CによるSQLインジェクションはできなくなりました。

2011-03-20 01:49:03
徳丸 浩 @ockeghem

PHP5.3.6のPDO/MySQLずっと調べていましたが、1)Linuxでは正しく動いているよう、2)Windowsでは文字エンコーディングの変換などはしてくれるが、エスケープ時に文字エンコーディングを考慮していないよう…これは脆弱性、というのが結論

2011-03-21 12:56:10
徳丸 浩 @ockeghem

@nihen ソースをgrepすると、たしかにmysql_optionsを使っていますね。mysql_set_character_setは使ってないようです

2011-03-21 17:33:35
徳丸 浩 @ockeghem

@haruyama 環境の問題を疑い、MySQL5.5とPHP5.3.6をクリーンインストールしてみましたが、現象は変わらないので、Windows版PHP5.3.6の問題だと思います

2011-03-21 23:09:22
徳丸 浩 @ockeghem

日記書いた / PHP5.3.6からPDOの文字エンコーディング指定が可能となったがWindows版では不具合(脆弱性)あり - 徳丸浩の日記 http://htn.to/hN8TLN

2011-03-22 10:10:29
CHIBA Masahiro @nihen

@ockeghem ちなみに、「データベース接続時の文字エンコーディング指定」てのは"SET NAMES sjis"ですか?

2011-03-22 11:08:24
徳丸 浩 @ockeghem

@nihen いいえ、パケットキャプチャしてもSET NAMESは流れていません。ログイン時のリクエストに文字エンコーディング 13 と指定されています。Latin1やUTF-8に変えると、該当のコードに変わるので間違いないと思います

2011-03-22 11:15:07
CHIBA Masahiro @nihen

@ockeghem 了解です。ハンドシェイクパケット自体にキャラクタセットがはいるやつですね。

2011-03-22 11:21:07
徳丸 浩 @ockeghem

@nihen はいそうです。キャプチャのハードコピーとっとけばよかったのですが、細切れの時間使ってやってたので今回は記録していません

2011-03-22 11:23:25
CHIBA Masahiro @nihen

windows PDO sjisのインジェクションの件わかったーw

2011-03-28 16:19:36
CHIBA Masahiro @nihen

windows-phpの用意されているバイナリではmysqlndがデフォルトで使われてるぽいけどmysqlndはまだ信頼できないつーことすねぇ

2011-03-28 16:25:20
CHIBA Masahiro @nihen

しかしまぁあれだ。原因わかったところで満足してしまったのでパッチ送ったりするのはまた今度…。

2011-03-28 16:30:07
CHIBA Masahiro @nihen

とりあえずmysqlndのsjisで困る人は、cp932を代わりに使うといいとおもいます。PDOでもcharset=cp932にするとおkです。

2011-03-28 16:32:32
徳丸 浩 @ockeghem

@nihen あー、これは酷いですね。テストしていない? でも原因が判明したので、僕のテストが間違ってなかったことも分かって安心したりしてw

2011-03-28 17:46:18
徳丸 浩 @ockeghem

まぁ、結果を分かっているから「これは酷い」となるんだけど、予断なしにソース見て気づくかというと難しいだろうな。だからこそテストというものをするわけで

2011-03-28 17:51:01
CHIBA Masahiro @nihen

あーちなみにPDOの件のmysql_set_character_setじゃないと駄目なんじゃないのーというのは間違いでした。ログイン時のパケットにcharacter setのコードが送られるから。

2011-03-28 23:09:48