除了检查attributeId是否在预定义的字符串列表中(可能,但在这种特定情况下代价很高)之外,是否有任何方法可以以一种不那么“可注入”的方式重写它(因为'${attributeId}'
的使用实际上是一个字段,而不是严格的参数)。..):
const { tablename, attributeId } = req.params;
let stmt = `SELECT DISTINCT row_data->'${attributeId}' as ${attributeId} FROM csv_data WHERE source = '${tablename}'`;
let result;
try {
await pool.connect();
result = await pool.query(stmt);
} catch (err) {
console.error(err);
}
...
return res.status(200).json({
rows: result.rows.map((elt, i, array) => {
return elt[attributeId];
}),
rowCount: result.rowCount,
});
2条答案
按热度按时间7eumitmz1#
你不想要一个准备好的语句,你想要一个参数化的语句:
也
pool.connect()
try
/catch
,也不要使用console.error
代替发送适当的错误响应m2xkgtsf2#
;-)实际上,我确实想使用动态列名,用于一个非常特定的目的,奇怪的是,这不是生产代码,所以控制台。error()是正确的。但还是谢谢你的关心。
解决方案是pg格式:
给了我我在寻找的东西,以及处理逃跑:
当然,我不需要
await pool.connect();
。- )