私はpg-promiseでデータベースクエリを書いています。私のテーブルは次のようになります。私はsetting
にいくつかの値を挿入したいハードコードされた値と変数の値を混在させて挿入しないでください。
- 3ハードコードされており、一つは私がvisualisation
からルックアップする必要があります。
次の文は、私が必要なものを行いますが、SQLインジェクションの脆弱性である必要があります。
var q = "INSERT INTO setting (user_id, visualisation_id, template_id) (" +
"SELECT $1, $2, template_id, $3 FROM visualisation WHERE id = $2)";
conn.query(q, [2, 54, 'foo']).then(data => {
console.log(data);
});
私はSQL namesを使用する必要があります知っていますが、私は次のようにそれらを使用してみた場合、私はTypeError: Invalid sql name: 2
取得:
2
を入れているので、私は推測
var q = "INSERT INTO setting (user_id, visualisation_id, template_id) (" +
"SELECT $1~, $2~, template_id, $3~ FROM visualisation WHERE id = $2)";
は驚くべきことではないので、SQLは、列名だと思っているようです。
私はまた、構文エラーを取得VALUES
を使用するクエリを書き換えしようとした場合:
var q = "INSERT INTO setting (user_id, visualisation_id, template_id) VALUES (" +
"$1, $2, SELECT template_id FROM visualisation WHERE id = $2, $3)";
SQLインジェクションのリスクを回避しながら、ハードコーディングおよび変数値の組み合わせを挿入するための最良の方法は何ですか?
質問を値として使用するには、サブクエリ、たとえば$ 1、$ 2などの角括弧内に入れてください(SELECT template_id FRAME visualization WHERE id = $ 2)、$ 3) " –
ここで@VaoTsunは正しいと思います。また、動的な列名を使用していないため、SQL Namesは何もしません。 –
ありがとう。最初の例では、内部クエリが動的な列名を使用するため、ユーザーが '$ 1'の代わりにSQLを供給して潜在的にSQLインジェクションを達成できなかったでしょうか? (私は脆弱性のために既存のコードをチェックしています) – Richard