我正在用pg-promise寫數據庫查詢。我的表是這樣的:插入混合硬編碼和變量值時避免SQL注入?
我想一些值插入到setting
- 三個都是硬編碼的,和一個我需要從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
:
var q = "INSERT INTO setting (user_id, visualisation_id, template_id) (" +
"SELECT $1~, $2~, template_id, $3~ FROM visualisation WHERE id = $2)";
我猜這不奇怪,因爲它把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 FROM visualization WHERE id = $ 2),$ 3)」' –
我認爲@VaoTsun在這裏是正確的。而SQL名稱在這裏沒有什麼可做的,因爲你沒有使用動態列名。 –
謝謝。在第一個例子中,用戶不能提供一些SQL來代替'$ 1'並且可能實現SQL注入,因爲內部查詢使用動態列名? (我正在檢查現有代碼是否存在漏洞。) – Richard