如何用准备好的语句替换这个明显错误的字符串插值?

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

除了检查 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,
  });
javascript node.js postgresql prepared-statement node-postgres
1个回答
0
投票

你不需要准备好的语句,你想要一个参数化语句

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
    而不是发送正确的错误响应
© www.soinside.com 2019 - 2024. All rights reserved.