Как предотвратить внедрение SQL с числовыми данными - PullRequest
0 голосов
/ 14 октября 2019

Я пишу короткий исходный код, и он работает хорошо. Но я хочу предотвратить внедрение 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) Но все еще не работает.

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Объединение параметров в строке всегда вызывает SQL-инъекцию. Почему бы не поместить displayId в массив params, как вы это делали для pageNumber?

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

Кроме того, вы можете использовать Number для разбора строки как числа вместо умножения на 1. Это должно решить вашу проблему.

0 голосов
/ 14 октября 2019

Предпочитают использовать значения в переменной, избегайте использования встроенного запроса, попробуйте использовать хранимую процедуру.

...