与仅采用原始 SQL 的“API”接口:节点/pSQL 清理,无需准备语句或参数化?

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

我正在使用客户 ERP 提供的“API”。它们没有实际的端点,而是有一个 REST 端点,您可以将原始 SQL 查询发送到该端点,然后它们执行。更糟糕的是,他们最近才升级到 https

我正在编写一些节点云函数来与该系统交互。将有两个角色使用此产品,我需要防止权限较少的角色在使用特定参数进行搜索时在应用程序中触发不需要的查询。

对于过滤,我可以检查这些值是否在允许的术语数组中,但通过搜索,我不太确定如何处理这个问题。我的一般意见一直是使用参数化语句,但这不是这里的一个选项,因为我实际上无法建立与其数据库的连接。我还看到一些帖子,人们建议将字符串包装在美元符号中,因为底层数据库是 PostgreSQL,但我在文档中找不到用于此目的的任何内容。

我也在考虑只允许字母数字字符,但这似乎是一个潜在的弱方法。如果有人知道处理这种情况的任何库或想法,我将不胜感激。

我尝试寻找可以帮助这种情况的 Node 库或文档,但我找不到任何相关内容。

sql node.js database postgresql sql-injection
1个回答
0
投票

我发现了关于这个问题的有趣帖子:https://security.stackexchange.com/questions/172297/sanitizing-input-for-parameterized-queries。 总而言之,进行数据清理(更像是一般验证)总是个好主意,但它不一定保证查询是安全的。即使您找到一些很棒的库来清理数据以使其 SQL 安全,直接运行不带参数化语句的查询仍然是一个很大的风险。 相反,尝试想办法不直接运行用户输入。在其间添加某种映射器,它将接受一些过滤器代码并将其转换为 SQL 值。例如,如果我有送货公司并且想要过滤状态为“已送达”的所有送货,我会使用如下映射:

const status_code = "DELIVERED"
const statusMapper = {DELIVERED: "delivered"(value to filter in sql)}

如果我的映射器找不到精确匹配,则返回错误或空结果,并且根本不运行查询。如果是搜索栏,请尝试识别最常见的搜索关键字并为此构建映射器。显然它不会太准确,但仍然比有 sql 注入的风险要好,特别是如果您使用敏感且重要的数据(我假设您与 ERP 集成后使用公司的内部数据)。

© www.soinside.com 2019 - 2024. All rights reserved.