如何阻止SQL Server执行单字符串内的多条T-SQL语句并仅允许SELECT查询
针对SQL Server多语句执行限制与单SELECT语句校验的解答
能否阻止SQL Server一次执行多条T-SQL语句?
默认情况下SQL Server支持单批次执行多条连续的T-SQL语句,没有内置的全局开关直接禁止多语句执行,但可以通过以下方案实现等效限制:
- 权限控制:为执行动态SQL的账号仅分配对应业务所需的最小权限,比如只开放查询权限、禁止所有修改类操作权限,就算恶意传入多语句也无法执行非授权操作,这是最稳妥的方案。
- 执行参数配置:如果是应用程序调用SQL,强制使用参数化查询而非字符串拼接传入SQL语句,从根源上避免攻击者注入多语句。
- 批处理限制:部分数据库访问驱动支持配置禁用批处理执行,开启后传入的多语句会直接被驱动拦截,不会提交到SQL Server执行。
无需遍历关键字验证字符串仅包含单条合法SELECT语句的方案
不需要自行扫描所有SQL关键字,用SQL Server内置的功能就能完成校验,可靠性远高于自定义正则/关键字匹配:
- 语法与语句数量预校验
执行以下语句对目标SQL字符串做预解析,该模式下只会检查语法不会实际执行语句:
SET PARSEONLY ON; -- 替换为你要校验的SQL字符串 待校验的SQL内容 SET PARSEONLY OFF;
如果校验的SQL包含多条语句、语法不合法会直接抛出错误。
2. 语句类型校验
调用动态管理函数sys.dm_exec_describe_first_result_set 校验语句类型:
SELECT * FROM sys.dm_exec_describe_first_result_set(N'待校验的SQL内容', NULL, 0)
如果返回结果为空,说明该语句不是合法的查询语句;如果要进一步确认没有后续隐藏语句,可以结合只读权限账号执行,双重确保不会执行非SELECT操作。
注意:不建议自行实现关键字匹配校验,很容易被注释、大小写、特殊字符拼接等方式绕过,SQL Server内置解析功能的可靠性远高于自定义校验逻辑。
内容的提问来源于stack exchange,提问作者Neil
相关产品推荐
相关产品推荐

