3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

psqlでSQLを実行する場合、あまり外部から来た値は使わないので、SQL埋め込み時にエスケープしないと思います。

例えば、以下のようにシェル変数をINSERTに埋め込んで実行する場合、一見、問題なさそうに見えますが、

$ v=foo
$ psql -c "INSERT INTO t VALUES ('$v')"
INSERT 0 1
$ psql -c "SELECT * FROM t"
  c
-----
 foo
(1 行)

シェル変数に悪意のあるSQLを含めると、以下のようにINSERTの後に別のSQLを実行でき、SQLインジェクションができてしまいます。

$ v="foo'); TRUNCATE t; --"
$ psql -c "INSERT INTO t VALUES ('$v')"
INSERT 0 1
TRUNCATE TABLE
$ psql -c "SELECT * FROM t"
 c
---
(0 行)

そのような場合、psqlには-vまたは--set--variableオプションで変数を渡して、SQL内で:'変数名'という形で参照する機能があって、この機能を使うと、以下のように値が自動的にエスケープされて、SQLインジェクションを防ぐことができます。

$ v="foo'); TRUNCATE t; --"
$ echo "INSERT INTO t VALUES (:'v')" | psql -v v="$v"
INSERT 0 1
$ psql -c "SELECT * FROM t"
           c
-----------------------
 foo'); TRUNCATE t; --
(1 行)

この機能を使う際の注意点としては、-cまたは--commandオプションで指定したSQLでは変数を参照できないので、SQLをファイルに記述して-fまたは--fileオプションでファイル名を指定するか、上記のように標準入力から読み込む必要があります。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?