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

如何在PostgreSQL中使用安全屏障视图(Security Barrier Views)防止侧信道攻击?

酷磊君_8505

酷磊君_8505

发布时间:2026-07-19 14:44:59

|

189人浏览过

|

来源于php中文网

原创

普通视图无法阻止侧信道攻击,只有显式创建 security_barrier = true 视图且所有依赖函数标记为 LEAKPROOF,才能阻断谓词下推和中间结果暴露。

如何在postgresql中使用安全屏障视图(security barrier views)防止侧信道攻击?

普通视图无法阻止侧信道攻击——攻击者可通过自定义低成本函数(如 RAISE NOTICE)触发提前执行,从而泄露被 WHERE 过滤的行数据;只有显式启用 security_barrier = true 并确保所有依赖函数为 LEAKPROOF,才能真正阻断谓词下推和中间结果暴露。

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

PostgreSQL 默认不开启安全屏障,即使视图定义含 WHERE groupid = 2,查询时仍可能把外部条件(如 attack(id, info))下推到视图内部执行,导致未授权数据被函数“打印”出来。

正确写法:

CREATE VIEW v_userinfo WITH (security_barrier = true) AS
  SELECT * FROM userinfo WHERE groupid = 2;

错误写法(无声明,等同于普通视图):

CREATE VIEW v_userinfo AS
  SELECT * FROM userinfo WHERE groupid = 2;

验证是否生效:

  • 运行 \d+ v_userinfo,输出中必须出现 Security barrier: yes
  • 或查系统表:SELECT definition FROM pg_views WHERE viewname = 'v_userinfo';,确认定义未被隐式重写

所有调用的函数必须标记为 LEAKPROOF

若视图里用了 to_tsvector('english', body) 或你写的 mask_phone(),而它没设 LEAKPROOF,PostgreSQL 会拒绝在 security_barrier 视图中使用它——轻则报错,重则静默降级为普通视图,失去防护能力。

检查方式:

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

若 proleakproof 为 false,需重建函数(仅超级用户可操作):

CREATE OR REPLACE FUNCTION mask_phone(text) RETURNS text AS $$
  SELECT regexp_replace($1, '(\d{3})\d{4}(\d{4})', '\1****\2');
$$ LANGUAGE sql LEAKPROOF;

注意:

  • 内置函数如 upper()、length() 通常是 LEAKPROOF;但 to_tsvector()、jsonb_path_match() 等默认不是
  • LEAKPROOF 函数会强制先执行,不管成本高低——如果函数实际很慢,会影响整体性能
  • 含 RAISE NOTICE、PERFORM pg_sleep() 或访问外部资源的函数,绝不能标为 LEAKPROOF

避免与 RLS 或 WITH CHECK OPTION 混用

security_barrier 和 WITH CHECK OPTION 互斥:PostgreSQL 明确禁止同时使用,建视图时会直接报错。

与 RLS(行级安全)共存时更需谨慎:

  • 若底层表已启 RLS,且视图 owner 有足够权限,RLS 策略会在视图过滤前执行,可能提前截断数据——但这是预期行为
  • 若视图设为 security_invoker = on,RLS 按调用者身份检查,此时 security_barrier 仍有效,前提是所有函数都 LEAKPROOF
  • 最危险场景:RLS + 普通视图 + 非 LEAKPROOF 函数 —— 攻击者可用 attack() 绕过 RLS 和视图双重过滤

测试时务必用无权限的普通用户连接,而非 postgres 或视图 owner 账户。否则你看不到真实防护效果。

用 EXPLAIN (VERBOSE) 确认执行计划未被干扰

安全屏障是否起作用,最终得看执行计划。加 VERBOSE 可看到谓词是否被“锁死”在视图内:

EXPLAIN (VERBOSE) SELECT * FROM v_userinfo WHERE attack(id, info);

理想输出应显示:

  • Filter: (userinfo.groupid = 2) 出现在最内层扫描节点
  • attack(id, info) 出现在外层 Filter,且不与 userinfo.* 字段混在同一节点
  • 没有 Row Security Policy 提前介入或谓词被重排的提示

若发现 attack() 出现在 Seq Scan on userinfo 节点内部,说明屏障失效——要么没加 security_barrier = true,要么某个函数漏标 LEAKPROOF。

真正难的不是加那行 WITH (security_barrier = true),而是整条依赖链上每个函数都得是 LEAKPROOF,且你得用非特权账户反复验证执行计划——漏掉任意一环,视图就只是个心理安慰。

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

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

DeepSeek

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

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

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

二狗PPT
二狗PPT Hot

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

相关专题

更多
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中文网欢迎大家前来学习。

4549

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

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

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

精品课程

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

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