【问题标题】:Do es6 template literals protect against sql injection?es6 模板文字是否可以防止 sql 注入?
【发布时间】:2019-03-05 03:51:21
【问题描述】:

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

更具体地说,我计划在节点项目中使用mssql 模块。在模板文字部分下的文档中,它说“所有值都会自动清理以防止 SQL 注入”。这纯粹是因为 ES6 模板文字的工作原理吗?

【问题讨论】:

  • 你的意思是 XSS 吗?
  • @aquinas 由于 OP 使用 node.js 标记,我认为问题确实与服务器端的 SQL 注入有关。然而答案是否定的,模板文字不能防止任何事情。它们只是构建字符串的一种“奇特”方式。

标签: javascript sql node.js ecmascript-6 sql-injection


【解决方案1】:

不,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 标记,因此清理是由模块中的该函数提供的。谢谢你的回答。
  • 请注意文档中提到 TAGGED 模板识字被清理,标记在另一个答案和文档中得到了很好的解释
【解决方案2】:

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

您可以使用sql.query by node-mssql 作为标签或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;--'

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

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2013-08-01
    相关资源
    最近更新 更多