2009/09/05

SQLインジェクション対策の罠

※この日記は嘘が含まれている可能性があります。参考にしないことを勧めます。

あるときPostgreSQLのpg_restoreに失敗していることに気がついた。
ここら当たりがあるとすれば、PostgreSQL7.4.X から PostgreSQL8.3.X にアップデートしたぐらい。

pg_restoreでリストア失敗していると思われるテーブルをまずplain形式で出力。
そのままSQLで流すと下記のエラーが発生した。

invalid byte sequence for encoding "EUC_JP":


このキーワードでググると下記のWebページにたどり着いた。

http://ml.postgresql.jp/pipermail/pgsql-jp/2007-June/021718.html

> おそらく、ver8.1.4以降で厳格化されたエスケープ文字の取り扱いに
> ひっかかったのかな?と推測しております。

これか!
・PostgreSQL 8.1.3から8.1.4の変更点:
http://www.sraoss.co.jp/PostgreSQL/8.1.4/changes.html

#おそらく半角カナのところで失敗していると思われる。
#PHPでpg_escape_string()関数を使っているので気がつかなかった。

で、文字をエスケープしてpg_dumpするオプションでもあるのかなあ?と思って探したが無い。

社内からのみのアクセスのシステムとはいえ、backslash_quoteの設定をいじるのは、あまりにも気持ち悪いので避けたい。

まあ結論は「Shift_JISは使うな」なんだが、既に動いてしまっているシステムをいじるわけにもいかない。

結局スマートな解決方法が見いだせず。

0 件のコメント: