避免子查询中的SQL注入

问题描述 投票:0回答:1

以下代码将子查询添加到数据库的 INSERT 语句中使用的值数组中。它被用在 API 实用程序类中,其中请求的值作为参数传递。

问题在于漏洞扫描正在检测SQL注入问题,这是正确的。分离子查询执行,我可以解决该漏洞,但由于多个数据库访问,它可能会导致性能问题。

是否可以更改此代码以使其免受 SQL 注入的影响,但不单独执行子查询(保留子查询)?

try {
  const formattedValues = request.values.map((element) => {
    const value0 = mysql.escape(element[0]);
    const value_table = mysql.escape(`TABLE_${value0}`);
    const value1 = mysql.escape(element[1]);
    const value2 = mysql.escape(element[2]);
    let sqlSelect = mysql.format(
      "(SELECT VALUE5 FROM ?? WHERE value1 = ? AND value2 = ?)",
      [value_table, value1, value2]
    );
    element.splice(4, 0, sqlSelect);
    return element;
  });

  const sql = `INSERT INTO TEST_TABLE
  (value0, value1, value2, value3, value4, value5, value6, value7, value8)
  VALUES ?;`;

  const response = await db.query(sql, [formattedValues]);
  return response;
} catch (e) {
  return e;
}
javascript sql mysql
1个回答
0
投票

除非我误解了你的问题,

const sqlSegments = [
  `INSERT INTO TEST_TABLE (value0, value1, value2, value3, value4, value5, value6, value7, value8) VALUES `,
];
const values = [];
for (const element of request.values) {
  const [table, v1, v2] = element;
  sqlSegments.push(`(SELECT VALUE5 FROM ?? WHERE value1 = ? AND value2 = ?)`);
  sqlSegments.push(", ");
  values.push(`TABLE_${table}`, v1, v2);
}
sqlSegments.pop(); // remove last comma
const response = await db.query(sqlSegments.join(" "), values);
© www.soinside.com 2019 - 2024. All rights reserved.