SQL Server 全文搜索 CONTAINS() 是不是容易受到 SQL 注入的攻击?

Posted

技术标签:

【中文标题】SQL Server 全文搜索 CONTAINS() 是不是容易受到 SQL 注入的攻击?【英文标题】:Is SQL Server's full text search CONTAINS() vulnerable to SQL Injections?SQL Server 全文搜索 CONTAINS() 是否容易受到 SQL 注入的攻击? 【发布时间】:2021-12-04 22:57:34 【问题描述】:

在我们的代码库中,我们使用 Hibernate 并使用它的 Restrictions.sql() 方法使用 MS SQL Server 的全文搜索。 sqlRestriction 是使用 CONTAINS(column_name, search_text) 谓词构建的,其中 search_text 是用户输入的文本。

Restrictions.sqlRestriction("CONTAINS(" + column_name + ", ?)", "\"" + userInput + "*\"", StandardBasicTypes.STRING)

这个 CONTAINS() 方法是否容易受到 SQL 注入的攻击?

【问题讨论】:

如果注入不正确,Any SQL 很容易受到攻击。使用CONTAINS 不会使查询或多或少容易受到影响。 CONTAINS 可以参数化,所以只要你参数化,你就可以了。 @Larnu AFAIK 列名无法参数化。没有实例设置,因此无法测试 这不会改变我的观点,@Charlieface。注入必须正确的内容,参数化可以正确的内容。如果这样做,您将大大减少/消除注入问题。 CONTAINS 不会使语句容易受到注入,而注入会。 Hibernate 本身在构建实际查询时参数化给定的 userInput。此外,jdbc 驱动程序使用 sp_executesql 过程来运行此查询。每当我尝试在 userInput 中注入另一个 sql 查询(如 drop table 或 select *)时,都会出现语法错误。所以不清楚在 contains() 中可能进行了哪些其他注入。 contains() 中的任何此类注入工作示例? 【参考方案1】:

我对 SQL 注入知之甚少,但根据我的阅读,它只会影响您使用“like”搜索列中的部分文本,这里我们正在搜索整个用户文本,所以我认为它很好,但最好通过自己进行一些注入攻击作为测试来符合要求。 最好多搜索一些关于该主题的内容或等待一些好的答案

【讨论】:

【参考方案2】:

是的,这种注入很容易受到攻击。这并不是说是CONTAINS 本身导致了问题,而是注入才是问题所在。 p>

很遗憾,CONTAINS() 不接受列名的变量,因此需要注入。为了确保此注入安全,您必须对照白名单对其进行检查。

如果根据白名单进行验证,则不存在漏洞。 不要直接接受用户输入到查询中。

【讨论】:

以上是关于SQL Server 全文搜索 CONTAINS() 是不是容易受到 SQL 注入的攻击?的主要内容,如果未能解决你的问题,请参考以下文章

对于 CONTAINS 全文谓词,SQL Server 2008 中的逻辑短路似乎失败

SQL Server 全文搜索返回意外结果

SQL Server 2012 安装或添加全文搜索

如何强制 SQL Server 在 WHERE 子句之前处理 CONTAINS 子句?

在sql server中参数化全文查询

sql 全文搜索 CONTAINS() *有时* 没有结果