es6 模板文字是否可以防止 sql 注入?

Do es6 template literals protect against sql injection?

es6 模板文字在用于构造查询时是否可以防止 SQL 注入?您能否提供一些常见攻击的示例以及如何缓解这些攻击?

更具体地说,我打算在节点项目中使用 mssql 模块。在模板文字部分下的文档中,它说 "All values are automatically sanitized against SQL injection"。这是否纯粹是因为 ES6 模板文字的工作方式?

不,ES6 模板文字只是构建字符串的另一种方式,如果您使用它们从提供的用户输入构建原始 SQL 查询而没有保护您免受 SQL 注入附加过滤/转义:

let name = "Robert'; DROP TABLE Students;--"; // user supplied input

let sql = `SELECT * FROM Students WHERE name = '${name}'`; // build query...

console.log(sql); // Injected SQL!

是的,但前提是您使用适当的标签。当你使用标签时,它被称为标签模板文字。标签就在第一个反引号之前。

您可以使用sql.query by node-mssql as a tag or https://github.com/TehShrike/sql-tagged-template-literal

const SQL = require('sql-template-strings');
let name = "Robert'; DROP TABLE Students;--"; // user supplied input

let sql = SQL`SELECT * FROM Students WHERE name = '${name}'`; // build query...

console.log(sql); // Non-injected SQL!

// SELECT * FROM Students WHERE name = 'Robert''; DROP TABLE Students;--'

提示!如果使用 sql 标签,编辑器可能会自动语法 highlight the SQL inside the template literal