ES6 标记模板文字和输入之间的区别?

问题描述 投票:0回答:1

mssql中,

ES6 标记模板文字 使用以下语法:

return sql.query`select * from mytable where id = ${value}`

输入使用以下语法:

request.input('input_parameter', sql.Int, value)

就好处而言,我看到使用输入而不是标记模板文字有一件事。它是数据类型规范。不过据我了解,两者都可以防止SQL注入。

我的问题是 ES6 标记模板文字和输入之间还有什么区别(如果有的话)?因为如果没有,那么我认为使用输入会更好。我正在决定使用哪一种作为编码的标准方式。

javascript node.js sql-server express
1个回答
0
投票

对于使用模板文字语法的 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( ... );
}
© www.soinside.com 2019 - 2024. All rights reserved.