You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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内置的功能就能完成校验,可靠性远高于自定义正则/关键字匹配:

  1. 语法与语句数量预校验
    执行以下语句对目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:24:02