編集部が厳選した「いま、みんなに見てほしいまとめ」をイチオシとして紹介しています!グサッと刺さる良質まとめはこちら!

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

@ockeghemさんのエントリ http://www.tokumaru.org/d/20110322.html#p01 の前後の関連tweetをまとめますた。 結果的にはwindowsではなくmysqlndが問題てことかなと。 続きを読む
PHP MySQL
4299view 0コメント
4
ログインして広告を非表示にする
HARUYAMA Seigo @haruyama
PHP 5.3.6以降では PDO/MySQLのDSNでのcharset指定が有効になったようです. (MySQL 4.1.11以降, MySQL 5.0.7以降, もしくはMySQLNDを利用している場合)
徳丸 浩 @ockeghem
【中間報告】Windows環境でPHP5.3.6のPDO/MySQLの検証中。接続文字列での文字エンコーディング指定は有効になるも、set namesで指定したのと同じ挙動のように見える。Shift_JISの場合、0x5CによるSQLインジェクションができる。引き続き検証する
徳丸 浩 @ockeghem
【続き】Windows環境でPHP5.3.6のPDO/MySQLの検証。ログイン時に文字コードを指定されていることをネットワークキャプチャで確認。SQLインジェクションがおこる理由は調査中。PDO内のエスケープの不備か
s_hskz (ほしくず) @s_hskz
@ockeghem id:do_aki さんのhtn日記(20100221)と関連があります?
徳丸 浩 @ockeghem
@s_hskz 関連あります。PDOの問題は、静的プレースホルダがデフォルトで使われないことと、文字エンコーディングが指定する方法がないことの2点によりSQLインジェクション脆弱性が混入するもので、そのうちの前者に該当します。僕がいま調べているのは後者です
Masahiro Chiba @nihen
PDOの件は、mysql_set_character_setじゃなくてmysql_optionsを使うように開発途中で変えてるぽいんだけどそれだと http://goo.gl/hJsYA の問題がおこるよねーって話じゃないかなぁと
Masahiro Chiba @nihen
でも @ockeghem さんがログイン時に文字コードが送られていると言っておられるので違うかなぁ。まぁコミットログしかみてないで発言してますがw
徳丸 浩 @ockeghem
Linux上のPHP5.3.6のPDO/MySQLでの検証ですが、期待通りに動いているようです。こちらは、Shift_JISの0x5CによるSQLインジェクションはできなくなりました。
徳丸 浩 @ockeghem
PHP5.3.6のPDO/MySQLずっと調べていましたが、1)Linuxでは正しく動いているよう、2)Windowsでは文字エンコーディングの変換などはしてくれるが、エスケープ時に文字エンコーディングを考慮していないよう…これは脆弱性、というのが結論
徳丸 浩 @ockeghem
@nihen ソースをgrepすると、たしかにmysql_optionsを使っていますね。mysql_set_character_setは使ってないようです
徳丸 浩 @ockeghem
@haruyama 環境の問題を疑い、MySQL5.5とPHP5.3.6をクリーンインストールしてみましたが、現象は変わらないので、Windows版PHP5.3.6の問題だと思います
徳丸 浩 @ockeghem
日記書いた / PHP5.3.6からPDOの文字エンコーディング指定が可能となったがWindows版では不具合(脆弱性)あり - 徳丸浩の日記 http://htn.to/hN8TLN
Masahiro Chiba @nihen
@ockeghem ちなみに、「データベース接続時の文字エンコーディング指定」てのは"SET NAMES sjis"ですか?
徳丸 浩 @ockeghem
@nihen いいえ、パケットキャプチャしてもSET NAMESは流れていません。ログイン時のリクエストに文字エンコーディング 13 と指定されています。Latin1やUTF-8に変えると、該当のコードに変わるので間違いないと思います
Masahiro Chiba @nihen
@ockeghem 了解です。ハンドシェイクパケット自体にキャラクタセットがはいるやつですね。
徳丸 浩 @ockeghem
@nihen はいそうです。キャプチャのハードコピーとっとけばよかったのですが、細切れの時間使ってやってたので今回は記録していません
Masahiro Chiba @nihen
windows PDO sjisのインジェクションの件わかったーw
Masahiro Chiba @nihen
windows-phpの用意されているバイナリではmysqlndがデフォルトで使われてるぽいけどmysqlndはまだ信頼できないつーことすねぇ
Masahiro Chiba @nihen
しかしまぁあれだ。原因わかったところで満足してしまったのでパッチ送ったりするのはまた今度…。
Masahiro Chiba @nihen
とりあえずmysqlndのsjisで困る人は、cp932を代わりに使うといいとおもいます。PDOでもcharset=cp932にするとおkです。
徳丸 浩 @ockeghem
@nihen あー、これは酷いですね。テストしていない? でも原因が判明したので、僕のテストが間違ってなかったことも分かって安心したりしてw
徳丸 浩 @ockeghem
まぁ、結果を分かっているから「これは酷い」となるんだけど、予断なしにソース見て気づくかというと難しいだろうな。だからこそテストというものをするわけで
Masahiro Chiba @nihen
あーちなみにPDOの件のmysql_set_character_setじゃないと駄目なんじゃないのーというのは間違いでした。ログイン時のパケットにcharacter setのコードが送られるから。
残りを読む(1)
ログインして広告を非表示にする
ログインして広告を非表示にする