如何控制SQL存储过程的执行权限?

云杰酱_5761

云杰酱_5761

2026-08-12

923人浏览

原创

真正控制存储过程执行权限需分两层:一是限制谁可调用(execute),二是限定过程内能做什么(如仅select特定表);必须避免授予调用者直接表权限、启用trustworthy或忽略所有权链,而应使用execute as绑定专用用户并显式授权其最小所需权限。

如何控制sql存储过程的执行权限?

只给 EXECUTE 权限远远不够——用户能跑通过程,不代表过程里干的事受控。真正控制执行权限,得拆成两层:谁被允许调用它,以及它被允许干什么。

只授 EXECUTE,别碰表权限

常见错误是授权时顺手加了表级权限,比如:GRANT EXECUTE ON dbo.usp_GetOrder TO app_user 后又跟一句 GRANT SELECT ON dbo.Orders TO app_user。这等于把后门焊死了。

  • 用户一旦有直接查表权,就能绕过过程逻辑,拼接恶意条件或批量导出
  • 审计日志里看到 app_user 频繁访问 sys.tables 或 sys.columns,大概率是过程用了 SELECT * 且用户有元数据权限
  • 正确做法:确认该用户不在 db_datareader、db_datawriter 角色里,再显式 DENY INSERT, UPDATE, DELETE ON SCHEMA :: dbo TO app_user

用 EXECUTE AS 锁定过程运行身份

不加 EXECUTE AS,过程默认以调用者身份执行,权限随用户走;设成 EXECUTE AS OWNER 又太危险(owner 往往是 dbo)。

  • 建一个无登录专用用户:CREATE USER proc_executor WITHOUT LOGIN
  • 只授过程真正需要的权限,比如仅查一张日志表:GRANT SELECT ON dbo.RequestLog TO proc_executor
  • 创建过程时绑定:CREATE PROCEDURE usp_LogRequest WITH EXECUTE AS 'proc_executor' AS ...
  • 这样无论谁调用,过程都只用 proc_executor 的权限干活,调用者连这张表的 SELECT 权都不用有

跨库引用必须三段名 + 目标库单独授权

过程如果写 OtherDB.dbo.Config,光在本库授 EXECUTE 没用。SQL Server 会逐跳检查权限链。

  • 目标库不能开 TRUSTWORTHY ON(默认就是 OFF,别动)
  • 必须进 OtherDB 执行:USE OtherDB; GRANT SELECT ON dbo.Config TO proc_executor
  • 过程内引用必须带完整三段名:OtherDB.dbo.Config,不能省略库名
  • 漏掉任一环,执行就报错:The server principal "proc_executor" is not able to access the database "OtherDB" under the current security context.

DML 操作要靠运行时拦截补防

权限控制是第一道防线,但开发阶段可能误写 UPDATE,上线后也得主动拦住。

  • 别信正则匹配 SQL 文本(t.text LIKE '%INSERT%'),易误判、性能差、绕过方式多
  • 更稳妥的是在关键逻辑外层加 TRY...CATCH,并在 CATCH 中检查 ERROR_NUMBER() 是否为 3902(事务被回滚)或 3621(影响行数异常)
  • 如果过程依赖视图,得一层层验清视图底层触达的表和权限链——视图本身没写权限,不代表它 JOIN 的表也没

最易被忽略的是所有权链断裂和跨 schema 引用:哪怕所有权限都配对了,只要过程里调用另一个没加 EXECUTE AS 的子过程,或者引用了 other_schema.TableA 却没给 proc_executor 授对应 schema 权限,整条链就失效。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2053

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1259

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

735

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2732

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4548

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1059

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4811

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4302

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5594

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习