【问题标题】:cannot use backtick when using nodejs 7.3.0使用 nodejs 7.3.0 时不能使用反引号
【发布时间】:2017-05-16 16:37:35
【问题描述】:

我正在尝试运行一个简单的网站,但遇到以下反引号错误

  `INSERT INTO questions(qid, uid, question, difficulty, cid) VALUES(${qid},${uid},${question},${difficulty},${cid})`,
   ^^^^^^
SyntaxError: Unexpected identifier
    at Object.exports.runInThisContext (vm.js:78:16)
    at Module._compile (module.js:543:28)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Module.runMain (module.js:605:10)
    at run (bootstrap_node.js:420:7)
    at startup (bootstrap_node.js:139:9)
    at bootstrap_node.js:535:3

这是代码

app.put('/problems', function(req, res) {
  pool.getConnection(function(err, connection) {
    var p_list = new Array(4);
    var qid = mysql.escape(req.body.qid);
    var uid = mysql.escape(req.body.uid);
    var question = mysql.escape(req.body.question);
    var difficulty = mysql.escape(req.body.difficulty);
    var cid = mysql.escape(req.body.cid);
    var choices = req.body.choices;
    var answer = mysql.escape(req.body.answer);
    var explanation = mysql.escape(req.body.explanation);
    var qid_choice = ``;
    choices.forEach( choice => {
      choice = mysql.escape(choice);
      qid_choice += "("+qid+", "+choice+"),";
    } );
    qid_choice = qid_choice.slice(0,-1);

    var queries = [
      `INSERT INTO questions(qid, uid, question, difficulty, cid) VALUES(${qid},${uid},${question},${difficulty},${cid})`,
      `INSERT INTO questionInfo(qid) VALUES(${qid})`,
      `INSERT INTO choices(qid, choice) VALUES ${qid_choice}`,
      `INSERT INTO solutions(qid, answer, explanation) VALUES(${qid},${answer},${explanation})`
    ];
    for (let i=0; i<4; i++) {
      p_list[i] = new Promise(function(resolve, reject) {
        connection.query(
          queries[i],
          err => {
            if (err) reject(err);
            else resolve();
          }
        );
      });
    }

    Promise.all(p_list).then(function() {
      connection.release();
      console.log(`[200] ${req.method} to ${req.url}`);
      res.end();
    }, function(err) {
      connection.release();
      console.log(`[500] ${req.method} to ${req.url} because ${err}`);
    })
  });
});

我正在使用节点版本 7.3.0

我不知道为什么会出现这个错误......这太令人沮丧了

感谢您的阅读:)

【问题讨论】:

  • 不要使用模板字符串来创建基于用户输入的数据库查询字符串。这只会让自己面临 SQL 注入攻击。
  • @mscdex 谢谢!我会更加小心:)

标签: node.js


【解决方案1】:

SQL 注入警报

您的整个代码是一个巨大的SQL injection 漏洞等待被利用。现在很少有可利用的 SQL 注入漏洞,但在这里您可以在每个参数中找到它。

永远不要这样做

connection.query(
    `INSERT INTO questionInfo(qid) VALUES(${qid})`,
    err => {
        // ...
    }
);

或:

connection.query(
    'INSERT INTO questionInfo(qid) VALUES(' + qid + ')',
    err => {
        // ...
    }
);

总是这样做

connection.query(
    'INSERT INTO questionInfo(qid) VALUES(?)',
    qid,
    err => {
        // ...
    }
);

你的问题

查看您的问题,您似乎有不平衡的反引号,或者您在 Node.js 中发现了一个错误。很难说更多,因为您没有发布一个重现您的问题的最小示例,而是发布了您的路由处理程序的一个不完整部分,如果没有您删除的部分,它甚至无法运行。

但是您应该感谢您遇到了反引号问题,因为没有它您甚至永远不会知道您的代码有多不安全。我什至不记得我上次看到带有 SQL 注入漏洞的代码是什么时候。自从我上次向某人推荐这部漫画以来已经有好几年了:

请阅读:

记住不要使用反引号将未经处理的数据插入任何字符串,尤其是 SQL。

【讨论】:

  • 我认为 mysql.escape 方法会为我阻止这些事情......非常感谢!
  • 哇,这是不平衡的反引号哈哈。但我不会在 SQL 查询中使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 2011-09-22
  • 1970-01-01
  • 2011-07-24
相关资源
最近更新 更多