如何防止 SQL 注入数字数据

How to prevent SQL injection with number data

我编写了简短的源代码并且运行良好。但是我想防止 SQL 注入。因为这段代码不能防止 SQL 注入。

这是我的原始代码

router.get(`/sitemap/:page`, function(req, res, next) {
  let pageNumber = String(req.params.page) + "00";
  db.query(
    `SELECT * FROM user order by displayId*1 LIMIT ${pageNumber}, 100`,
    function(error, data) {
      if (error) {
        throw error;
      }
      // console.log(data);
      res.render("sitemap", {
        dataarray: data,
        pageNumber: pageNumber
      });
    }
  );
});

效果很好,但无法防止SQL注入,所以我尝试了这个方法,但由于'字符而出错。

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?, 100' at line 1

[尝试了另一种方法]

router.get(`/sitemap/:page`, function(req, res, next) {
  let pageNumber = String(req.params.page) + "00";
  db.query(
    `SELECT * FROM user order by displayId*1 LIMIT ?, 100`,
    [pageNumber], // I FIX THIS PART!!!!
    function(error, data) {
      if (error) {
        throw error;
      }
      // console.log(data);
      res.render("sitemap", {
        dataarray: data,
        pageNumber: pageNumber
      });
    }
  );
});

我该如何解决这个问题。我认为它应该是字符串,所以我尝试了 String(pageNumber) 但仍然无法正常工作。

更喜欢在变量中使用值, 避免使用内联查询, 尝试使用存储过程。

在字符串中连接参数总是邀请 SQL 注入。为什么不像 pageNumber 那样将 displayId 放入 params 数组中?

let pageNumber = String(req.params.page) + "00";
db.query(`SELECT * FROM user order by ? LIMIT ?, 100`,
                 [Number(displayId), pageNumber],

此外,您可以使用 Number 将字符串解析为数字,而不是使用乘以 1。 它应该可以解决您的问题。