UPDATE文やINSERT文にはパラメータ選択でSELECTを使用できる
こんな感じ
INSERT INTO table WHERE id = (SELECT ~);
例えばpostgres用のPHP関数pg_escape_string()だとシングルクォーテーションや" ; "
とかをエスケープしていてSELECT文は実行されてしまう。
そこに、例えばこんなCASE文を入れると
(SELECT case when getpgusername() = CHR(110)||CHR(115) then 1 else NULL end)
getpgusername()がCHR(110)||CHR(115)ではない場合、NULLがSELECTされる。
DBのテーブル設定で該当カラムにNOT NULLを指定していると
NULLは入れられません
みたいなエラー文が返ってくる。
つまり、この例ではユーザーネームはCHR(110)||CHR(115) ではありませんよということがわかってしまう。
逆に、エラーが返ってこなければユーザーネームはCHR(110)||CHR(115) であるということがいえる。
と、いうことでエスケープだけでは防げない例でした。