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
もみんな使うな、と言われているのでしょうか…。
このあたりに詳しい方、どなたか教えてください。