我想知道接受 SQL 查询和输出结果集的 HTTP API 可能存在哪些潜在滥用。这是 SQL 注入的规范定义这一事实对我来说并没有丢失 :)
就我而言,我有一个特定的 PHP/MySQL 应用程序,它是 Magento - 一个电子商务平台。
以下是我考虑过的一些安全措施:
- 非标准 URL 路由 - 为了防止大规模扫描,每个安装都有自己的 URL 路由(这类似于 Magento 的管理后端的处理方式)
- 一个相当长的 API 密钥
- 仅 HTTPS 访问
- 通过只读 MySQL 用户进行只读访问。
- 通过 SQL 解析进行只读访问。如果可以以这种方式实现只读访问,则需要更少的配置。我正在考虑简单地解析“INSERT”、“UPDATE”、“DROP”等的查询。
- 列入黑名单的表和字段。在大多数情况下,配置数据存储在一个名为 的表中
core_config_data,因此可以将其列入黑名单。诸如信用卡令牌之类的东西也可以存储在特定表的特定字段中。在非常糟糕的实现中,信用卡也可以明文存储,当然需要将其列入黑名单。 - 白名单表和字段访问——也许只允许访问白名单表和字段比黑名单更好。
- 有很多社区扩展也可能存储敏感信息。默认情况下很难普遍阻止它们,所以我认为白名单可能是解决这个问题的唯一选择。
- 一些最大重试次数/频率的机制
- 用于保护 SSH 连接的其他标准东西,例如 IP 白名单、公钥认证、VPN 等。
假设这些措施已经到位,这是否会与 IP 白名单锁定的 SSH 访问一样安全或更安全。
更新:应用程序的更多细节,以跟进答案中的一些问题。
- 我正在寻找构建的东西是一个 Magento 模块,它将被部署到商店并接受 SQL 查询以将数据返回到我的 SaaS 应用程序。我拥有该模块和 SaaS 应用程序。
- 有问题的应用程序将是一个 SaaS 应用程序,它利用 Magento 提取数据。因此,这不是只有受信任的员工才能访问的情况。
- 理想的最低安全级别(从配置量的角度来看)是不使用只读用户。
- 让我们假设将被阻止的误报不是问题(抱歉,“Bobby Insert Tables”)。
更新 2:只是想更详细地说明我选择将这个问题与带有 IP 地址白名单的 SSH 连接进行比较的原因。
用于所有意图和目的的 SSH 连接在功能上已经与原始 SQL API(以及更多)相同,因为您可以通过 SSH 进入并连接到 MySQl,然后做任何事情。所以我的想法是,如果 SQL API 与 SSH 连接一样安全或更安全,它可能会带来可接受的风险水平。
另外,我知道这种类型的问题可能过于主观,所以我想以一种可以有一个相对客观的答案的方式来构建它,这就是为什么我想将它与特定的 SSH 场景进行比较。