在mssql中,
ES6 标记模板文字 使用以下语法:
return sql.query`select * from mytable where id = ${value}`
输入使用以下语法:
request.input('input_parameter', sql.Int, value)
就好处而言,我看到使用输入而不是标记模板文字有一件事。它是数据类型规范。不过据我了解,两者都可以防止SQL注入。
我的问题是 ES6 标记模板文字和输入之间还有什么区别(如果有的话)?因为如果没有,那么我认为使用输入会更好。我正在决定使用哪一种作为编码的标准方式。
对于使用模板文字语法的 SQL 注入预防,不能提供针对 SQL 注入的保护,请改用准备好的语句。这就是
request.input
方法类型检查的目的。
给出的代码:
// executes and returns a promise
return ( sql.query`select * from mytable where id = ${value}` )
.then( result, reject -> ... );
对于使用开发人员预先创建的查询执行功能样式很有用,但绝不应该与用户输入一起使用。
创建输入是准备语句的一个步骤,如果接受用户输入,则应使用该输入。
基本示例:
function selectItem( id, ... ) {
let req = new sql.Request();
req.input('id', sql.Int, id);
...
req.query('SELECT * FROM my_table WHERE id = @id').
.then( ... )
.catch( ... );
}