2016-06-07 64 views
3

如果可以動態確定名稱並仍然防止SQL注入攻擊,那麼如何正確提供表名?(node-postgres,pg)正確插入表名

例如:

下面的作品,但我認爲是不安全的:

dbclient.query("INSERT INTO " + table_name + " VALUES ($1, $2, $3)", [value_a, value_b, value_c])

我想什麼相同(但不工作)是:

dbclient.query("INSERT INTO $1 VALUES ($2, $3, $4)", [table_name, value_a, value_b, value_c])

編輯: 我正在使用node-postgreshttps://github.com/brianc/node-postgres

回答

0

你可以手動檢查表的正確性,如果表名與正則表達式的其他驗證邏輯。我可能會使用包含允許的表名的字典。

var tables = {users:'users', boats:'boats'}; 
table_name = tables[table_name]; 
if (! table_name) throw new Error(); 
dbclient.query("INSERT INTO " + table_name + " VALUES ($1, $2, $3)", [value_a, value_b, value_c]) 

如果您計劃產生了很多動態SQL,使用查詢生成器像http://knexjs.org/

0

一下怎麼樣哈希let tables = {tableName1: 'table_name1', tableName2: 'table_name2'...}然後

//assuming you receive t as table name input 
if(tables[t]) 
    //build SQL query with tables[t] as the table name 
else 
    //throw error about non-existing table 

這樣,你就控制實際DB中的表名。

此外,不要忘記清理所有輸入 - 值可能包含注射。

0

任何好的圖書館應該爲SQL名稱,其中包括提供適當的轉義:

  • 架構名稱
  • 表名
  • 列名

例如,內pg-promise你會使用它是這樣的:

db.query("INSERT INTO $1~ VALUES ($2, $3, $4)", [table_name, value_a, value_b, value_c]) 

即你可以通過在~之後附加變量來正確地轉義表名,這反過來又使它免於SQL注入。

here,一個簡單的逃避庫所執行的表名:

return '"' + name.replace(/"/g, '""') + '"'; 

參見:SQL Names