gstack 部署 Supabase RLS 收紧迁移后如何用 verify-rls.sh 验证读与更新已被拦截

发布时间:2026/9/9 21:20:27

gstack 部署 Supabase RLS 收紧迁移后如何用 verify-rls.sh 验证读与更新已被拦截 gstack 部署 Supabase RLS 收紧迁移后如何用 verify-rls.sh 验证读与更新已被拦截【免费下载链接】gstackUse Garry Tans exact Claude Code setup: 23 opinionated tools that serve as CEO, Designer, Eng Manager, Release Manager, Doc Engineer, and QA项目地址: https://gitcode.com/GitHub_Trending/gs/gstackgstack 的遥测数据存储在 Supabase 上supabase/migrations/002_tighten_rls.sql这条迁移把 anon key 对所有遥测表的 SELECT 策略和 installations 表的 UPDATE 策略全部移除只保留 INSERT 策略供 v0.11.16 之前的旧客户端继续直写 PostgREST。迁移部署到 Supabase 项目后需要用supabase/verify-rls.sh跑一遍冒烟测试确认三件事读请求确实被 RLS 拦截、对 installations 的更新确实被拦截、INSERT 仍然放行否则旧客户端会坏掉。这个脚本就是 0.11.16.0 版本随迁移一起引入的配套验证工具。002 迁移做了什么脚本在验证什么002_tighten_rls.sql 的关键动作DROP POLICY移除telemetry_events、installations、update_checks三张表上的anon_select策略DROP POLICY移除 installations 上不受限的anon_update_last_seen策略原策略允许更新全部列REVOKE SELECT显式收回crash_clusters、skill_sequences两个视图的 anon 读权限注释里写作 belt-and-suspenders三张表的anon_insert_only策略保留注释明确说明这是为了 v0.11.16 之前的旧客户端待 edge-function 同步普及后才会在后续迁移中移除。脚本头部注释verify-rls.sh声明的验证目标与之一一对应SELECT denied on all tables and views、UPDATE denied on installations、INSERT still allowed。运行前提需要bash和curl脚本内部用curl发请求mktemp建临时响应文件需要能访问 config.sh 里配置的 Supabase 项目地址。该文件自动提供两个变量GSTACK_SUPABASE_URL项目 URL和GSTACK_SUPABASE_ANON_KEY公开 key注释说明 RLS 已拒绝 anon key 的一切数据访问因此安全可提交仓库脚本必须针对已经部署了 002 迁移的 Supabase 项目运行否则验证结果没有意义。一个必须在运行前明确的副作用第三组 INSERT 检查会向该项目的telemetry_events、update_checks、installations表真实写入测试行如gstack_version: verify_rls_test、installation_id: verify_rls_test。这是脚本设计如此——它要验证的就是INSERT 仍然放行。如果你不想在生产数据里留下这些测试行应在测试环境项目上运行或运行后自行清理。执行验证在 gstack 仓库根目录运行脚本verify-rls.sh 头部注释给出的方式bash supabase/verify-rls.shCHANGELOG 中另外记录过cd supabase ./verify-rls.sh的等价写法两种方式都是文档中出现过的真实命令。脚本会依次执行 9 项检查全部走${GSTACK_SUPABASE_URL}/rest/v1/路径携带apikey和Authorization: Bearer头值就是 anon key检查项方法预期SELECTtelemetry_events/installations/update_checks/crash_clusters/skill_sequences各 1 条GETdenyUPDATEinstallationsinstallation_ideq.test_verify_rlsbody{gstack_version:hacked}PATCHdenyINSERTtelemetry_events/update_checks/installationsPOSTallow如何判断结果每个检查打印一行PASS、FAIL或WARN结束后输出汇总Results: 9 passed, 0 failed (of 9 checks) VERDICT: PASS — reads/updates blocked, inserts allowed以上为脚本输出格式PASS/FAIL 行是脚本按判断逻辑拼接生成的具体每条的 HTTP 码取决于服务端响应Results与VERDICT行的文案来自 verify-rls.sh。退出码全部通过为 0有任何 FAIL 或 WARN 时打印VERDICT: FAIL并以 1 退出。deny 类检查的判定规则verify-rls.sh值得留意因为 HTTP 码相同但含义不同返回401/403被拒绝PASSGET 返回200且响应体是[]或空说明 RLS 在行级过滤了数据PASS输出注明 RLS filteringGET 返回200且有数据说明数据泄漏FAILPATCH 返回204没有行被修改——无论原因是 RLS 拦截还是行不存在攻击者都无法改数据计为 PASS连接失败HTTP 码记为000或其他未预期状态码记 WARN 并计入 failed最终VERDICT: FAIL。allow 类检查中200/201/204以及409主键冲突说明 INSERT 策略生效、行已存在都计 PASS若 INSERT 被拒401/403则 FAIL意味着迁移误删了旧客户端依赖的策略。两个会影响判读的版本细节003 迁移会改变 UPDATE 检查的语义。003_installations_upsert_policy.sql 在 002 之后重新给 installations 加了一条受限的 UPDATE 策略anon 通过列级GRANT UPDATE (last_seen, gstack_version, os)只能更新这三列first_seen和installation_id不可改。如果你的项目已经部署到 003脚本里那条gstack_version的 PATCH 检查即使服务端允许该列更新也会因为test_verify_rls这行不存在而返回 204脚本按no rows affected计为 PASS。也就是说这条检查在 002 之后的完整迁移链上验证的是匿名调用者无法造成数据变更而不是字面上的UPDATE 语句被策略拒绝。旧版脚本的边界 case 已修复。CHANGELOG0.11.16.1记录了verify-rls.sh曾存在的误判现在 INSERT 成功、409冲突、204空更新都被正确处理为通过。如果你手上的脚本版本早于该修复遇到409/204时的判定结果可能和本文描述不一致建议先确认脚本内容。结论与限制成功条件唯一9 项检查全部 PASSVERDICT: PASS退出码 0即读/更新被拦截、INSERT 放行与 002 迁移的设计目标一致。任何FAIL或WARN含连接失败都意味着验证未通过要么迁移未部署到位要么 URL/anon key 配置config.sh与目标项目不符要么网络不通。脚本对mktemp失败会直接中止verify-rls: mktemp failed, aborting不使用可预测的 PID 路径回退——这是共享机器上防止响应文件被预建/符号链接攻击的行为遇到中止时应检查TMPDIR//tmp的可写性而不是绕开它。该脚本只覆盖 REST 层PostgREST RLS的 anon key 行为服务端的读写走 edge function 与service_role_key不在本脚本的验证范围内。【免费下载链接】gstackUse Garry Tans exact Claude Code setup: 23 opinionated tools that serve as CEO, Designer, Eng Manager, Release Manager, Doc Engineer, and QA项目地址: https://gitcode.com/GitHub_Trending/gs/gstack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/9 21:15:27

个人开发者AI编程工具选型指南:提效、避坑与工作流实践

我见过不少个人开发者,装了AI编程工具之后效率反而没提升多少,甚至还被一把梭生成的错误代码坑到凌晨三点。问题通常不在工具本身,而在于没搞明白AI编程工具在当前阶段到底擅长什么、不擅长什么,以及自己的项目到底需要哪一层能力…

2026/9/9 21:15:27

AI编程工具怎么选怎么用?独立开发者实战指南

先聊个很现实的事:我见过不少独立开发者,工具装了一堆,GitHub 星标收藏了几百个,真到写代码的时候还是靠手工硬扛。AI 编程这事火了两三年了,从最早的 Copilot 到现在的各种 AI IDE、对话式编程助手,选择多…

2026/9/9 22:05:33

向量数据库实战:从语义搜索到RAG知识库的选型与避坑

做AI应用开发绕不开一个现实问题:模型再聪明,也记不住所有业务数据。企业知识库、AI智能体、RAG(检索增强生成)现在几乎成了应用开发的三件套,而其中真正决定上限的,往往不是模型本身,而是底下那…

2026/9/9 22:05:33

Apple Silicon Mac忘记密码怎么办?一文搞定密码重置与数据恢复

前几天一个朋友抱着MacBook Air M1找我,说孩子放假回来把电脑密码改了,问了几次都不肯说,人已经回学校了,电脑里毕业论文初稿还没备份。我一看系统是macOS Sequoia,心里先打了个底:如果是几年前Intel芯片的…

2026/9/9 22:05:33

Vite不是内部或外部命令?从报错原理到前端构建工具链梳理

“vite”不是内部或外部命令,也不是可运行的程序或批处理文件。如果你是在Windows环境下第一次创建Vite项目时撞上这句提示,那多半不是Vite本身的问题,而是Node环境、终端路径或者依赖安装环节没对上。这篇文章我会从这里入手,把报…

2026/9/9 22:05:32

探秘PEB结构:进程路径与命令行伪造的实现原理与检测

简介:一份面向Windows安全研究与逆向工程学习者的C工具资源,围绕进程环境块(PEB)的结构修改,演示如何伪装当前进程的ImagePath、进程名及相关参数,帮助读者理解用户态与内核态之间的信息交互及安全软件检测…

2026/9/9 22:05:32

数据库配置重载全攻略:从重启到热加载,一文讲清四种方法

线上 MySQL 改完max_connections,顺手执行了FLUSH PRIVILEGES,再用SHOW VARIABLES一查,参数纹丝没动。这种经历我遇到过不止一次。很多刚接触数据库维护的朋友会把“重新加载数据库配置”想成一条命令的事,但实际上,不…

2026/9/9 22:00:32

MySQL 8.0安装后必做的安全加固与运维配置实战

写这个系列已经到第23篇了,MySQL相关的内容这是第二篇。上一篇把安装过程基本讲完了,这篇准备说点安装完成之后立刻要面对的事:初始化安全加固、账号权限怎么分配、配置文件哪些参数值得动、日常备份怎么做、遇到连接不上或者说Socket报错怎么…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/9 0:00:48

MHS模型硬件标准:让大模型像调用软件一样控制物理设备

让Claude真正看着显微镜说“这个细胞形态不太对”,或者让大模型自己调一版机械臂的运动轨迹,这事儿听上去已经很接近科幻片了。但你真上手试一次就会发现,模型不缺智商,缺的是一个能插进显微镜、机械臂、激光控制器里的“通用插座…

2026/9/9 0:00:48

AI五大核心方向详解:从机器学习到大模型,零基础转行选哪条?

会有人告诉我,他想转行学AI,但打开招聘网站一看直接傻眼:机器学习、深度学习、自然语言处理、计算机视觉、大模型应用……满屏都是这些词,好像每个都会一点,又好像每个都离自己很远。还有人上来就问“学Python还是学Ja…

2026/9/9 0:00:49

从50行最小循环到生产级AI引擎:工程化改造全解析

直接说干货。这一章我写的不是那种"hello world跑通某个模型"的教程,而是把AI引擎当做一个真正要上线、要被人调用、要扛流量的系统来聊。从最初只有50行的最小循环,到能够承载生产流量的AI引擎,中间差的不是代码量,而是…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码