【发布时间】: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 指定别名;那是代码,不是数据。
标签: java sql sql-server security sql-injection