(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-postgres
:https://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