restrict v2
This commit is contained in:
@@ -157,3 +157,17 @@ L4 整页停用、举报按钮与箱主面板筛选、邮件告警。分享卡
|
|||||||
同时核实:`Dockerfile` 的构建命令是 `go build ... ./cmd/`(不是根目录),所以两个入口必须同步 ——
|
同时核实:`Dockerfile` 的构建命令是 `go build ... ./cmd/`(不是根目录),所以两个入口必须同步 ——
|
||||||
已写进 MEMORY.md。部署前必须先确认 `./NekoBox --help` 里有 `restrict`,否则是旧产物。
|
已写进 MEMORY.md。部署前必须先确认 `./NekoBox --help` 里有 `restrict`,否则是旧产物。
|
||||||
手册里另注明两项只能人工手测:L2(回答应保存为私密)、L3(回答应被拒绝)。
|
手册里另注明两项只能人工手测:L2(回答应保存为私密)、L3(回答应被拒绝)。
|
||||||
|
|
||||||
|
### 首次实跑反馈(用户 dry-run)
|
||||||
|
|
||||||
|
用户给 `DOMAIN=admin56` 跑 dry-run,结果 2 项 FAIL。日志证据:`SELECT * FROM "users" WHERE domain='admin56'`
|
||||||
|
→ **record not found**,说明该 domain 不存在(很可能把账号名当成了 domain)。所有 `/_/admin56` 的 302
|
||||||
|
都来自 `GetByDomain` 失败后的 `Redirect("/")`,与处置无关 → **L4 那项 PASS 是假阳性**。
|
||||||
|
同时 dry-run 不施加处置,前后状态没变,状态断言本来就无意义 —— 是脚本设计缺陷。
|
||||||
|
|
||||||
|
已修 `dev/devcheck-restrict.sh`:
|
||||||
|
1. 基线不是 200 直接中止并打印排查建议(302 常见原因 + 查真实 domain 的命令);
|
||||||
|
2. dry-run 在基线后短路,不再做状态断言(只验命令存在、基线、停用页);
|
||||||
|
3. 新增 1b「停用页是否部署」+ 文案断言,dry-run 也能验 i18n/模板。
|
||||||
|
|
||||||
|
教训(已与既有坑同类):**302 / 200 都不能单独证明处置生效**,必须先确立「基线 200」这个前提。
|
||||||
|
|||||||
+35
-15
@@ -74,28 +74,48 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
say ""
|
say ""
|
||||||
say "== 1. 基线:处置前箱主页应可访问 =="
|
say "== 1. 基线:处置前箱主页必须可访问 =="
|
||||||
base=$(code "$BASE_URL/_/$DOMAIN")
|
base=$(code "$BASE_URL/_/$DOMAIN")
|
||||||
check "box page before restrict" 200 "$base"
|
if [ "$base" != 200 ]; then
|
||||||
|
say " FAIL 基线不是 200(got $base),后续断言全部无意义,已中止。"
|
||||||
|
say ""
|
||||||
|
say " 302 的常见原因(按概率排序):"
|
||||||
|
say " 1) 域名不存在或账号已停用 —— 先确认 DOMAIN 拼写。查一个真实域名:"
|
||||||
|
say " curl -s $BASE_URL/explore | grep -o 'href=\"/_/[^\"]*\"' | head -5"
|
||||||
|
say " 或在库上执行:select domain from users where deleted_at is null order by id desc limit 5;"
|
||||||
|
say " 2) 该箱主设置了页面密码 —— 此时首页是 200(渲染密码页),不是 302。"
|
||||||
|
say ""
|
||||||
|
say " 注意:302 不能证明任何处置生效。上次自检就出现过「箱主不存在 → 302」被误判成 L4 生效。"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
say " PASS box page = 200"
|
||||||
|
|
||||||
|
say ""
|
||||||
|
say "== 1b. 停用页是否部署(与处置无关,dry-run 也验)=="
|
||||||
|
check "restricted page reachable" 200 "$(code "$BASE_URL/restricted")"
|
||||||
|
body=$(curl -sL --max-time 10 "$BASE_URL/restricted")
|
||||||
|
if printf '%s' "$body" | grep -qE '一時的に利用できません|temporarily unavailable|暫時無法存取|暂时不可访问'; then
|
||||||
|
say " PASS restricted page copy rendered"
|
||||||
|
pass=$((pass + 1))
|
||||||
|
else
|
||||||
|
say " FAIL restricted page copy not found(i18n 或模板没部署上)"
|
||||||
|
fail=$((fail + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$RUN" != 1 ]; then
|
||||||
|
say ""
|
||||||
|
say "== dry-run:不做状态断言 =="
|
||||||
|
say " 状态没有被改动,断言 L4/L1 只会得到误导性结果。"
|
||||||
|
say " 基线已确认可访问,用 RUN=1 重跑以执行真实验证:"
|
||||||
|
say " RUN=1 BASE_URL=$BASE_URL DOMAIN=$DOMAIN TAMABOX=$TAMABOX bash $0"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
say ""
|
say ""
|
||||||
say "== 2. L4 整页停用 =="
|
say "== 2. L4 整页停用 =="
|
||||||
do_restrict L4
|
do_restrict L4
|
||||||
sleep 1
|
sleep 1
|
||||||
check "box page under L4" 302 "$(code "$BASE_URL/_/$DOMAIN")"
|
check "box page under L4" 302 "$(code "$BASE_URL/_/$DOMAIN")"
|
||||||
check "restricted page" 200 "$(code "$BASE_URL/restricted")"
|
|
||||||
if [ "$RUN" = 1 ]; then
|
|
||||||
body=$(curl -sL --max-time 10 "$BASE_URL/_/$DOMAIN")
|
|
||||||
if printf '%s' "$body" | grep -qE '一時的に利用できません|temporarily unavailable|暫時無法存取|暂时不可访问'; then
|
|
||||||
say " PASS restricted page copy rendered"
|
|
||||||
pass=$((pass + 1))
|
|
||||||
else
|
|
||||||
say " FAIL restricted page copy not found (检查 i18n 与模板是否部署)"
|
|
||||||
fail=$((fail + 1))
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
say " [dry-run] 跳过文案断言"
|
|
||||||
fi
|
|
||||||
|
|
||||||
say ""
|
say ""
|
||||||
say "== 3. L1 停止分发:页面恢复、分享卡被拦 =="
|
say "== 3. L1 停止分发:页面恢复、分享卡被拦 =="
|
||||||
|
|||||||
Reference in New Issue
Block a user