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 中的逻辑短路似乎失败