SQL Server全文检索CONTAINS()搭配Hibernate使用是否存在SQL注入风险?
问题分析结论
你给出的代码存在SQL注入漏洞,但风险不来自CONTAINS()方法本身,你当前对CONTAINS()第二个检索参数的预编译绑定用法是安全的,漏洞出在动态拼接column_name到SQL语句的操作。
详细拆解
userInput部分的处理是安全的:你用了?作为预编译占位符传递检索关键词,Hibernate会自动对传入的参数做转义处理,即使用户输入包含单引号、SQL关键字等恶意内容,也只会被当作普通字符串处理,不会被数据库当作SQL指令执行。column_name部分的拼接存在注入风险:你直接把column_name变量用字符串拼接的方式写入SQL片段,如果这个变量的取值可控(比如来自前端传参、可被用户篡改),攻击者可以构造恶意的列名内容实现注入。举个简单的攻击示例:如果攻击者把column_name篡改为name); DELETE TABLE goods--,最终执行的SQL就会变为:
直接触发删表操作,造成严重的数据损失。CONTAINS(name); DELETE TABLE goods-- , ?)
修复方案
如果业务确实需要动态指定全文检索的列:
- 维护一个允许参与全文检索的列名白名单,每次使用前校验
column_name是否在白名单内,不在的话直接拒绝请求 - 不要直接把外部传入的列名字符串拼接到SQL中
内容的提问来源于stack exchange,提问作者pattabirmn
相关产品推荐
相关产品推荐

