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

如何在PostgreSQL中定义带有安全屏障的视图_使用security_barrier属性

轻辰酱_8800

轻辰酱_8800

发布时间:2026-06-06 09:22:08

|

264人浏览过

|

来源于php中文网

原创

security_barrier视图必须显式启用且依赖LEAKPROOF函数,否则权限控制可能被绕过;需用WITH (security_barrier = true)创建,确保所有调用函数标记为LEAKPROOF,并避免与RLS或WITH CHECK OPTION冲突。

如何在postgresql中定义带有安全屏障的视图_使用security_barrier属性

security_barrier 视图不是“开了就安全”,而是必须显式启用、且依赖底层函数是否 LEAKPROOF,否则权限控制可能被绕过。

创建视图时必须显式声明 WITH (security_barrier = true)

PostgreSQL 默认不启用安全屏障,即使你用了 WHERE 过滤行,普通视图仍可能被攻击者用低成本函数(如自定义 attack())触发提前执行,从而泄露被过滤的数据。 security_barrier = true 强制 PostgreSQL 将视图的过滤条件作为“不可穿透的屏障”优先执行,阻断外部谓词下推干扰。 注意:该选项仅在 PostgreSQL 9.5+ 支持,且不能和 WITH CHECK OPTION 共存。

检查并确保所有依赖函数标记为 LEAKPROOF

如果视图里调用了自定义函数(比如 to_tsvector('english', body) 或你写的 mask_phone()),而它没被声明为 LEAKPROOF,PostgreSQL 会拒绝将其用于 security_barrier 视图——要么报错,要么降级为普通视图,失去保护能力。 验证方式:

SELECT proname, proleakproof FROM pg_proc WHERE proname IN ('to_tsvector', 'your_function_name');

若 proleakproof 为 false,需重建函数并加 LEAKPROOF 属性(仅超级用户可设):

PostgreSQL 18.4 ubuntu
PostgreSQL 18.4 ubuntu

PostgreSQL 18.4 官方 Ubuntu 安装包现已发布,这是目前最新的稳定版本。推荐通过官方 APT 仓库安装:先执行 sudo apt update 更新索引,再运行 sudo apt install postgresql-18 即可完成部署。新版本引入了异步 I/O 子系统,在顺序扫描与 VACUUM 场景下性能提升显著,同时支持 UUID v7 原生生成函数与虚拟生成列。

下载
CREATE OR REPLACE FUNCTION mask_phone(text) RETURNS text AS $$...$$ LANGUAGE sql LEAKPROOF;
  • 非 LEAKPROOF 函数可能暴露中间结果(如通过 RAISE NOTICE)
  • 内置函数如 length()、upper() 通常是 LEAKPROOF;但全文检索类函数默认不是
  • 用 EXPLAIN (VERBOSE) 查执行计划,确认没有意外出现 Row Security Policy 或谓词重排

避免与 RLS 表混用时的策略冲突

当视图底层表已启用了行级安全策略(RLS),而你又建了 security_barrier 视图,两者可能叠加或互斥: - 若 RLS 策略由视图 owner 执行(即 security definer 模式),它会在视图过滤前生效,可能提前截断数据; - 若视图设为 security_invoker = on,则 RLS 会按调用者身份检查,但此时 security_barrier 仍有效——前提是函数都 LEAKPROOF。 关键判断点:

  • 用 \d+ view_name 看视图属性是否含 security_barrier
  • 用 SELECT * FROM pg_views WHERE viewname = 'xxx'; 确认定义未被隐式改写
  • 测试时务必用无权限的普通用户连接,而非 postgres 或 owner 账户

为什么 security_invoker = on 会让视图更“严”,但也更易报错

默认视图是 security definer:以 owner 权限检查底层表访问权,所以只要给用户 SELECT 视图权限,ta 就能查到数据。 一旦执行 ALTER VIEW v SET (security_invoker = on),PostgreSQL 改为用调用者权限检查——这意味着用户必须对视图里所有基础表都有 SELECT 权限,否则直接报 permission denied for table xxx。 这不是 bug,是设计意图:它把权限控制粒度从“视图层”下沉到“表层”,配合 security_barrier 可构建双重防护,但代价是权限配置变复杂。

真正容易被忽略的是:安全屏障只防“谓词下推攻击”,不防“权限误配”或“函数侧信道”。哪怕你写了完美的 WITH (security_barrier = true),只要漏掉一个 LEAKPROOF 函数,或者忘了关掉某个用户的 USAGE on schema,整套防线就形同虚设。

热门AI工具

更多
WorkBuddy

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

讯飞智作

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

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

UpDream
UpDream Hot

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

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

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

DeepSeek

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

相关专题

更多
postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4709

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

647

2023.11.16

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有l、d、d5、di、ds、dv、df、dn、db、dg、dp、c、pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

1396

2023.11.20

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

480

2026.02.12

PostgreSQL 性能优化与查询执行计划实战
PostgreSQL 性能优化与查询执行计划实战

本专题深入解析PostgreSQL性能优化核心,聚焦查询执行计划的实战应用。通过EXPLAIN命令精准定位瓶颈,结合索引策略、SQL改写与参数调优,系统提升查询效率。从执行计划解读到性能调优全流程,助你掌握数据库性能诊断与优化实战能力。

150

2026.05.08

PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践
PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践

本文详解如何利用Next.js(搭配Drizzle ORM)与Go后端构建高性能应用,充分发挥PG在JSONB非结构化存储与pgvector向量检索上的优势。从数据建模到Docker容器化部署,打造支持AI时代的“One Database”工程化解决方案。

901

2026.05.08

PostgreSQL高级特性、内核机制与现代数据架构
PostgreSQL高级特性、内核机制与现代数据架构

本专题从MVCC并发控制与WAL日志等内核机制出发,详解JSONB、PostGIS及pgvector等高级特性。探讨如何利用单一引擎支撑关系型、向量及图数据等现代数据架构需求,助您掌握构建高并发、智能化应用的核心技术。

244

2026.05.08

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 20.7万人学习

PostgreSQL 手册
PostgreSQL 手册

共0课时 | 1万人学习

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

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