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

时间:2016-06-07 18:24:46

标签: sql node.js postgresql pg node-postgres

如果可以动态确定名称并且仍然阻止SQL注入攻击,那么如何正确提供表名?

例如:

以下作品但我相信是不安全的:

Eliom_tools.F.html ~title:"Main Page" ~js:[["lib";"three.min.js"]] Html5.D.(body .... )

我想要等同于(但不起作用)的是:

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])https://github.com/brianc/node-postgres

3 个答案:

答案 0 :(得分:1)

任何好的库都应该为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

答案 1 :(得分: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/

之类的查询构建器

答案 2 :(得分: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

这样,您可以控制数据库中的实际表名。

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