QLDB/PartiQL 中是不是可能存在 SQL 注入攻击

Posted

技术标签:

【中文标题】QLDB/PartiQL 中是不是可能存在 SQL 注入攻击【英文标题】:Is a SQL Injection Attack Possible in QLDB/PartiQLQLDB/PartiQL 中是否可能存在 SQL 注入攻击 【发布时间】:2021-08-07 06:17:43 【问题描述】:

这个问题出现在代码审查中,参考了必须使用字符串插值 (C#) 构建的选择查询,我似乎无法以一种或另一种方式找到参考。例如,查询可能类似于:

var sql = "SELECT * FROM someTable WHERE indexedField = ?";

由于在 WHERE 子句中使用了参数,我认为这两种方式都应该是安全的;但是,得到确认会很好。一些简单的尝试表明,即使尝试注入并且查询最终看起来像这样

Select * from SomeTable; SELECT * FROM SomeOtherTable Where IndexedField = "1"

引擎在尝试运行多个查询时仍会出错。

【问题讨论】:

你知道如何在SQL查询中使用UNION吗? 这是一个我没有考虑过的公平点,尽管在 PartiQL 规范中 UNION 似乎仍然不完整(并且,鉴于文档上的日期,实际上可能本身已经过时)。 【参考方案1】:

Select * from SomeTable; SELECT * FROM SomeOtherTable Where IndexedField = "1" 这样的注入确实会出错,因为 QLDB 驱动程序需要一个 txn.Execute() 每个查询。

为了降低注射的风险,我建议:

清理字符串插值以拒绝潜在的恶意参数 利用 QLDB 功能,允许使用 IAM 策略通过 PartiQL 命令和分类帐表分离访问,https://aws.amazon.com/about-aws/whats-new/2021/06/amazon-qldb-supports-iam-based-access-policy-for-partiql-queries-and-ledger-tables/

对于第二个选项,您可以为某些表定义权限,以在注入尝试的情况下拒绝不需要的访问。

【讨论】:

【参考方案2】:

需要字符串插值的任何特殊原因?

https://docs.aws.amazon.com/qldb/latest/developerguide/driver-quickstart-dotnet.html#driver-quickstart-dotnet.step-5 使用参数可能最有助于防止 sql 注入。

【讨论】:

我肯定在查询中使用参数来获取数据值。然而,我的问题出现了,我是基于一个对象动态命名列,所以除了字符串插值来构建 SQL 本身之外,没有更好的方法我能想到 现在 .感谢您的回复!

以上是关于QLDB/PartiQL 中是不是可能存在 SQL 注入攻击的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 SQL Server 中是不是存在列?

SQL 连接两个表并检查两个表中的每个值是不是存在

检查表是不是存在sql server [重复]

检查sql server ce中是不是存在项目的最佳方法?

SQL 检查分区中是不是存在值,使用 CASE WHEN 没有任何 JOIN

SQL 显示一条记录是不是存在于多个表中