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

fnatzsnv  于 2023-04-29  发布在  Node.js
关注(0)|答案(2)|浏览(93)

除了检查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,
  });
7eumitmz

7eumitmz1#

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

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,
});

  • 不要使用动态列名,如果你真的需要,你必须使用escape it
  • 如果您想使用一次性查询而不是客户端(稍后必须发布),请不要调用pool.connect()
  • 不要只在查询周围使用try/catch,也不要使用console.error代替发送适当的错误响应
m2xkgtsf

m2xkgtsf2#

;-)实际上,我确实想使用动态列名,用于一个非常特定的目的,奇怪的是,这不是生产代码,所以控制台。error()是正确的。但还是谢谢你的关心。
解决方案是pg格式:

const format = require("pg-format");

const stmt = format(
  "SELECT DISTINCT row_data->%L as %I FROM csv_data WHERE source = %L",
  attributeId,
  attributeId,
  tablename
);

给了我我在寻找的东西,以及处理逃跑:

"SELECT DISTINCT row_data->'state_code' as state_code FROM csv_data WHERE source = 'EQP'"

当然,我不需要await pool.connect();。- )

相关问题