2007年08月24日

SET NAMESは禁止?

PHPのセキュリティに詳しい大垣さんのブログ

SET NAMESは禁止

(引用)
============
脆弱性の説明は面倒ですが注意事項は簡単です。「DBMSをアプリケーションから利用する場合、文字エンコーディング設定は必ずAPIを利用する」つまり「SET NAMES(SET CLIENT_ENCODING等も)は禁止」です。
============

日本語以外の記事では、「SET NAMESを使ってはいけない」とまで書いている記事が見つからなかったので、いまだすんなりと納得できていないのですが、今後、MySQL 4.1以上を入れた共有サーバなんかではどうすればいいんでしょうか…。

“SET NAMES sjs”に問題がある、という記事は下記にありました。

t_komuraの日記
addslashes() による SQL 文字列のエスケープ回避問題

hoshikuzu | star_dust の書斎
■PHP 利用時に Shift_JIS で addslashes() によるエスケープ処理に SQL インジェクション可能な穴

“mysql_real_escape_string()でもSET NAMES sjis;等を実行した後に使うと2バイト目の0x5C文字がエスケープされないようです。”とあったので、

"0x5C SQL injection"
などで調べると、下記のページが。

http://www.postgresql.org/docs/techdocs.50
でも、このページには、

"this includes at least SJIS, BIG5, GBK, GB18030, and UHC."

とあります。大垣さんは、

SET NAMES ujis
SET NAMES utf8
SET NAMES binary

もみんな使うな、と言われているのでしょうか…。
このあたりに詳しい方、どなたか教えてください。
posted by SDozono at 15:45| 東京 🌁| Comment(10) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする