讲师中心 微信公众号
AI工具推荐 视频效率加速

SQL 函数的 SECURITY DEFINER 与权限提升风险防控

陌墨同学_5418

陌墨同学_5418

发布时间:2026-02-27 19:05:28

|

853人浏览过

|

来源于php中文网

原创

sql 函数的 security definer 与权限提升风险防控

在 PostgreSQL 中,SECURITY DEFINER 函数允许以函数定义者的权限执行逻辑,而非调用者权限。这在封装敏感操作(如日志写入、配置更新)时很有用,但若设计不当,极易成为权限提升的入口。

为什么 SECURITY DEFINER 函数容易引发提权?

核心在于“信任错位”:函数体内的 SQL 语句(尤其是动态 SQL)若拼接了用户可控输入,就可能绕过调用者原本受限的权限边界。例如,一个以超级用户定义、但接受表名参数的函数,若未校验表名合法性,调用者即可通过传入 'pg_authid; DROP TABLE users--' 类似字符串触发恶意操作。

常见高危模式包括:

  • 使用 EXECUTE ... USING 但未对变量做白名单校验或转义
  • 函数内直接拼接用户输入到 SQL 字符串(如 'SELECT * FROM ' || user_table)
  • 依赖 CURRENT_USER 或 SESSION_USER 做访问控制,却忽略其在 SECURITY DEFINER 下恒为定义者
  • 函数调用其他未加防护的 SECURITY DEFINER 函数,形成权限传递链

安全编写 SECURITY DEFINER 函数的关键原则

不依赖“输入看起来安全”,而应强制执行最小权限与输入净化:

  • 禁用动态拼接:优先使用静态 SQL;必须动态时,仅允许从预定义枚举或系统目录(如 pg_tables)中查出的合法标识符,并用 quote_ident() 包裹
  • 显式限定对象权限:函数内所有涉及的表、序列、函数等,定义者账户必须仅拥有实际需要的权限(如仅 SELECT,不给 UPDATE),避免“定义者权限过大”放大风险
  • 剥离敏感上下文:不在函数内调用 current_setting('app.user_id') 等依赖会话变量的逻辑,改用显式参数传入并验证
  • 记录与审计:对关键 SECURITY DEFINER 函数的调用,写入专用审计表(注意审计表自身也需权限隔离),包含 now()、current_user、session_user、参数摘要

运行时防护与监控建议

单靠编码规范不够,需结合数据库层管控:

  • 定期扫描:SELECT proname, proowner::regrole, prosecdef FROM pg_proc WHERE prosecdef,识别所有 SECURITY DEFINER 函数,逐个评估必要性与实现方式
  • 限制定义者身份:避免使用 postgres 或其他高权限角色定义业务函数;为每类敏感操作创建专用低权限角色(如 log_writer),仅授必要对象权限
  • 启用 log_statement = 'mod' 或更细粒度的 pg_audit 扩展,捕获 SECURITY DEFINER 函数内部执行的 DDL/DML
  • 测试用例覆盖:针对每个函数,构造含 SQL 注入片段、跨 schema 表名、保留字等的异常输入,验证是否报错而非静默执行

替代方案:多数场景其实不需要 SECURITY DEFINER

与其承担提权风险,不如优先考虑更安全的替代路径:

  • 行级安全策略(RLS):对共享表统一管控,让普通用户只能看到/改写自己数据,无需特权函数介入
  • VIEW + GRANT:用视图封装查询逻辑,配合列权限控制,调用者仍以自身权限运行
  • 应用程序层代理:将敏感操作收口到应用服务,由后端统一鉴权并以专用数据库连接执行,数据库侧保持零特权函数
  • SECURITY INVOKER + 授权链:让函数以调用者权限运行,再通过 GRANT EXECUTE ON FUNCTION 和对象权限组合实现精细控制

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

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

3803

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

811

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

989

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

5621

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2583

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

5600

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

7361

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1010

2024.04.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

80

2026.09.23

热门下载

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

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn