前回に引き続き、SQLインジェクション。メモ。
こんな、方法もある。
こちらを参考にした。
脆弱性の有無の確認。
---------------------------------------------------------
脆弱性の有無
(1) SJISを使ったクライアントでPHPのaddslashesを使った場合(あるいはmagic_quote_gpcがonの場合)に脆弱性がある。ほかの言語でも同様のことを行っていれば脆弱性がある。
なお,8.1.4 et. al. Security Release FAQによれば,PEAR DBを使っている場合にも脆弱性の可能性があるようである。
(2) フロントエンドとバックエンドのエンコーディングが異なっている場合に脆弱性がある。
(3) prepared statementを使用していれば脆弱性の可能性はない。ただし,prepared statementのようなインタフェースでありながら,実際には内部でSQL文を合成するなど,本物のプロトコルレベルのprepared statementを使っていないケースもありそうなので注意が必要である。
逆に言えば,(1)と(2)に該当しない,あるいは(3)に該当すれば脆弱性はないことになる。
---------------------------------------------------------
検証していこう。
(1) ・・・文字コードはutf-8を使用しているし、magic_quotes_gpc はoffでかつ、pg_escape_stringを利用しているのでOK.
(2) ・・・ソースもDBもutf-8を使用しているのでOK.
(3) ・・・利用していないが、(1)と(2)がOKなので、OK.
結論から言うと、PHP,Postgresql で開発している場合は
------------------------------------------------
(1) PostgreSQL 8.1.4,8.0.8,7.4.13,7.3.15のいずれかにアップデートする。
(2) シングルクォートをバックスラッシュでエスケープしている場合は,シングルクォートを重ねるエスケープ方法に変更する。PHPで言えば, magic_quote_gpcをoffにし,かつaddslashes()ではなくpg_escape_string()を使うようにする。
(3) (2)が難しい場合には十分注意しながらbackslash_quoteを設定する
------------------------------------------------
検証する。
(1) ・・・ 今回利用しているバージョンは、7.3.15なのでOK.
(2) ・・・ magic_quote_gpcをoffにし,かつaddslashes()ではなくpg_escape_string() を利用している。
(3) ・・・ (2)が可能なのでOK.