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

编程入门 行业动态 更新时间:2024-10-08 00:31:37

如何用准备好的语句替换这个明显错误的<a href=https://www.elefans.com/category/jswz/34/1771434.html style=字符串插值?"/>

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

除了检查 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
    而不是发送正确的错误响应

更多推荐

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

本文发布于:2024-05-30 06:46:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1770218.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字符串   如何用   语句   错误   插值

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!