以下代码将子查询添加到数据库的 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;
}
除非我误解了你的问题,
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);