字符串插值?"/>
如何用准备好的语句替换这个明显错误的字符串插值?
除了检查 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,
});
回答如下:
你不需要准备好的语句,你想要一个参数化语句:
const { tablename, attributeId } = req.params;
const stmt = 'SELECT DISTINCT row_data->$1 as attribute FROM csv_data WHERE source = $2;';
// ^^ ^^
const result = await pool.query(stmt, [attributeId, tableName]);
// ^^^^^^^^^^^^^^^^^^^^^^^^
res.status(200).json({
rows: result.rows.map(elt => elt.attribute),
rowCount: result.rowCount,
});
还有
- 不要使用动态列名,如果你真的需要,你必须转义它
- 如果您想使用一次性查询而不是客户端(您稍后必须发布),请不要调用
pool.connect()
- 不要只在查询周围使用
/try
,也不要catch
而不是发送正确的错误响应console.error
更多推荐
如何用准备好的语句替换这个明显错误的字符串插值?
发布评论