(node-postgres,pg)正确插入表名

问题描述:

如果可以动态确定名称并仍然防止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

你可以手动检查表的正确性,如果表名与正则表达式的其他验证逻辑。我可能会使用包含允许的表名的字典。

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/

一下怎么样哈希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中的表名。

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

任何好的图书馆应该为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