堆叠查询注入指的是攻击者在合法的SQL查询语句后拼接额外的SQL语句,利用数据库支持多语句执行的特性,执行未授权的操作,比如删除表、插入恶意数据、获取敏感信息等。在SQL Server中,限制数据库账号的执行权限是防范这类攻击的重要措施,下面从多个维度介绍具体的实现方法。

一、理解堆叠查询注入的权限利用逻辑
堆叠查询注入能够成功的前提,往往是当前使用的数据库账号拥有执行额外语句的权限。比如攻击者拼接了DROP TABLE users这样的语句,如果当前账号有删除表的权限,这条恶意语句就会被执行。因此限制账号权限的核心,就是让账号仅拥有完成自身业务所需的最小权限,没有多余的操作权限。
二、限制数据库账号执行权限的具体方法
1. 遵循最小权限原则创建账号
不要给业务账号分配sysadmin这类服务器级别的高权限角色,应该根据业务需求,仅给账号分配对应数据库的必要权限。比如只读业务的账号,只授予SELECT权限即可,不要授予INSERT、UPDATE、DELETE、DROP等写权限和修改结构权限。
创建最小权限账号的示例代码如下:
-- 创建登录名,仅允许从指定应用服务器访问 CREATE LOGIN app_reader WITH PASSWORD = 'StrongPassword123!', CHECK_POLICY = ON; -- 切换到业务数据库 USE business_db; GO -- 创建对应用户 CREATE USER app_reader FOR LOGIN app_reader; -- 仅授予查询权限,禁止其他操作 GRANT SELECT ON SCHEMA::dbo TO app_reader;
2. 限制账号可执行的语句类型
可以通过拒绝特定权限的方式,明确禁止账号执行危险语句。比如禁止账号执行DROP、ALTER、CREATE等修改数据库结构的语句,以及EXECUTE执行存储过程的权限(如果业务不需要的话)。
拒绝危险权限的示例代码如下:
USE business_db; GO -- 拒绝账号执行DROP、ALTER、CREATE语句的权限 DENY ALTER ON SCHEMA::dbo TO app_reader; DENY CREATE TABLE TO app_reader; DENY DROP ON SCHEMA::dbo TO app_reader; -- 如果业务不需要执行存储过程,拒绝EXECUTE权限 DENY EXECUTE ON SCHEMA::dbo TO app_reader;
3. 限制账号可操作的数据库对象范围
不要给账号授予整个数据库的权限,而是精确到具体的表、视图等对象。比如某个账号只需要查询orders表的数据,就只给这个表授予SELECT权限,不要授予整个dbo架构的权限。
精确到对象的权限配置示例:
USE business_db; GO -- 仅授予app_reader查询orders表的权限 GRANT SELECT ON dbo.orders TO app_reader; -- 拒绝app_reader访问users表的权限 DENY SELECT ON dbo.users TO app_reader;
4. 禁止账号使用堆叠查询的常用函数权限
部分堆叠查询会利用xp_cmdshell等扩展存储过程执行系统命令,需要明确禁止普通业务账号使用这类危险扩展。
禁用扩展存储过程的权限配置示例:
-- 拒绝普通业务账号执行xp_cmdshell的权限 DENY EXECUTE ON sys.xp_cmdshell TO app_reader;
三、权限配置的验证与维护
配置完权限后,需要验证配置是否生效。可以用配置好的账号登录SQL Server,尝试执行堆叠的恶意语句,比如执行SELECT 1; DROP TABLE test;,如果返回权限不足的错误,说明配置生效。
同时需要定期审计数据库账号的权限,及时回收不再需要的权限,避免权限随着业务变更逐渐膨胀,重新带来堆叠查询注入的风险。
四、配合其他防护措施
限制账号权限是基础防护手段,还需要配合参数化查询、输入校验、使用存储过程封装数据访问逻辑等措施,形成多层防护体系,才能更全面地防范堆叠查询注入攻击。
SQL_Server堆叠查询注入数据库账号权限执行权限限制安全防护修改时间:2026-06-22 02:39:18