任何允许 Pivot 中的撇号 SQL 列别名的安全问题?
Posted
技术标签:
【中文标题】任何允许 Pivot 中的撇号 SQL 列别名的安全问题?【英文标题】:Any security issue allowing apostrophe SQL column alias name from Pivot? 【发布时间】:2019-02-26 21:19:01 【问题描述】:[silly ' name%']
来自用户输入的 Select t.value as [silly ' name %'] from Test_Table t
之类的内容是否构成安全威胁?
我正在进行的项目允许用户通过 sql pivot
重新排列数据,使输入值成为列。现在我们“转义”列名,双引号任何单个刻度,这会导致查询失败,因为它与表中的实际文本不匹配。 not 逃避这个有什么问题吗?
我一直在测试简单的 sql 注入作为列名,这似乎不是问题。
编辑我们确实将括号括在括号中,所以输入像
silly] from Test_Table t; drop table Test_Table;
会变成
select [silly]] from Test_Table t; drop table Test_Table;]
【问题讨论】:
这在很大程度上取决于您如何处理输入。 那是我的问题,没有清理输入。从我所看到的将文本括在括号中对于任何特殊字符都是安全的。我想我正在寻找对此的验证,我觉得很脏哈哈。 如果您将 any 用户输入替换为 SQL,则存在威胁。在您的示例中,如果他们使用silly] from Test_Table t; drop table Test_Table; --
作为输入会发生什么?那么,为什么你打算这样做?必须有一个更安全的替代方案,您可以在应用程序的其他地方实施。
如果您正在使用准备好的语句之类的东西,并且您的 SQL 供应商说这些字符没问题,那么您可能没问题。字符串粘贴,没那么多。
@chrylis - 没有准备好的语句允许别名、列名等参数化。参数化可确保您的参数始终是 data 和从不代码。这个问题特别是是关于是否有一种安全的方法允许用户为生成的 SQL 指定别名;那是代码,不是数据。
【参考方案1】:
基于:https://docs.microsoft.com/en-us/sql/t-sql/data-types/constants-transact-sql?view=sql-server-2017 和https://docs.microsoft.com/en-us/sql/t-sql/statements/set-quoted-identifier-transact-sql?view=sql-server-2017 我的意见是,只要您提供格式为
的列名SELECT 1 AS 'Some Name'
记得转义单引号(双引号)你应该是安全的。
例子:
SELECT 1 AS 'The level for job_id: %d should be between %d and %d.'
SELECT 1 AS 'silly] from Test_Table t; drop table Test_Table; --'
SELECT 1 AS ']][["'
SELECT 1 AS '''; SELECT 1 --'
SELECT 1 AS 'SELECT 1 / 0'
【讨论】:
以上是关于任何允许 Pivot 中的撇号 SQL 列别名的安全问题?的主要内容,如果未能解决你的问题,请参考以下文章