如果可以动态确定名称并且仍然阻止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。
答案 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
这样,您可以控制数据库中的实际表名。
此外,不要忘记清除所有输入 - 值可能包含注射。