【问题标题】:Postgres Sanitization of Inputs Failure输入失败的 Postgres 清理
【发布时间】:2021-06-17 06:46:52
【问题描述】:

我正在构建一个简单的 API,API 的一部分应该返回 PG 数据库中给定列的所有唯一值。这一切都包含在使用无服务器框架的 lambda 函数中。除了这个之外,所有其他 API 都可以工作,当我手动将查询输入 PG 时,它们都可以工作。我不确定发生了什么,有什么建议吗?

失败的 API 命中示例:/columnVals/?field=title

const app = express();
const Pool = require("pg").Pool;
const pool = new Pool({
  user: <USER>,
  password: <PASSWORD>,
  database: <DBNAME>,
  host: <DBURL>,
  port: <DBPORT>,
});

...

app.get("/columVals/", cors(), function (req, res) {
  var all_query = `SELECT DISTINCT $1 FROM database_archive;`;
  pool.query(all_query, [req.query.field], (error, results) => {
    if (error) {
      throw error;
    }
    res.status(200).json(results.rows);
    let data = results.rows;
    data = data.map((a) => Object.values(a));
    data = data.flat().filter((n) => n);
    data = [...new Set(data)];
    res.status(200).json(data);
  });
});

由于某种原因,这仍然有效(这显然容易受到 SQL 注入的影响,这就是您不使用它的原因)。

app.get("/columVals/", cors(), function (req, res) {
  var all_query = `SELECT DISTINCT ${req.query.field} FROM database_archive;`;
  pool.query(all_query, (error, results) => {
    if (error) {
      throw error;
    }
    res.status(200).json(results.rows);
    let data = results.rows;
    data = data.map((a) => Object.values(a));
    data = data.flat().filter((n) => n);
    data = [...new Set(data)];
    res.status(200).json(data);
  });
});

lambda 函数服务器错误是 500 代码内部服务器错误。我的问题是为什么要对参数进行清理,即使它不构成 SQL 注入攻击威胁,它也会失败。

【问题讨论】:

    标签: postgresql lambda serverless-framework aws-serverless


    【解决方案1】:

    你没有说这是用什么语言编写的。我假设是一些 Javascript 变体。

    您也不必费心发布错误函数的实际输出。这会很有用,并且可能会让您完全不用发布问题。

    在您的第一个示例中,您使用的是参数占位符。这 不是 简单的字符串替换 - 它就像将参数传递给函数。它用于值而不是查询的结构元素(如列名或表名)。

    所以在您的第一个示例中,您要求SELECT DISTINCT &lt;literal value&gt; FROM &lt;table whose values are not used&gt;

    由于您不知道您的两个示例之间的区别,而且这似乎可以从一般互联网访问,我敦促您阅读“SQL 注入”并尽快查看您的代码。

    您的第二个示例使任何可以向该端点发布请求的人都可以访问您的整个数据库。

    【讨论】:

    • 有点不必要的侵略,服务器的输出是“Internal Server Error”,代码显然是javascript(我应该澄清一下)并且我非常熟悉SQL注入攻击(我什至以前写过它们)。显然第二个留下了这个漏洞,这就是我不使用它的原因。话虽如此,感谢您就文字值提出的观点。请调整您的答案,以便技术社区的新手不要离开它。
    • “内部服务器错误”即使在第二次尝试时也不是有用的错误级别,是吗?代码也不是明显的 Javascript,因为...我不是网络开发人员,我是数据库开发人员。那个“=>”不是我在十年前曾经做过的小 javascript 中记得的东西。看在上帝的份上,如果你知道代码是危险的,那么你将它发布在一个问答网站上,成千上万的初学者可能会偶然发现它?如果您知道查询参数替换和字符串插值之间的区别,您为什么要发布这个问题?
    • 如果你没有足够的细节请不要回答,要求澄清/投票结束
    • 额外信息不是为了我的利益,而是为了 OP 的利益(谁不必问他是否深入了解了数据库中实际发生的情况) .投票结束只会杀死他的问题,让他的问题没有解决。
    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 2020-08-05
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多