第 4 卷
18初始: canary
| 19 | observe(拦,true) → stage=canary hits=1误伤=0放过=0 |
|---|---|
| 20 | observe(拦,true) → stage=canary hits=2误伤=0放过=0 |
| 21 | observe(拦,true) → stage=active hits=3误伤=0放过=0 |
22 23=== 闭环:老化(长期无命中)===
| 24 | tick(无命中)→ stage=canary hits=0误伤=0放过=0 |
|---|---|
| 25 | tick(无命中)→ stage=canary hits=0误伤=0放过=0 |
| 26 | tick(无命中)→ stage=aged_out hits=0误伤=0放过=0 |
27 28=== 闭环:自动回退(过宽候选灰度期误伤超阈值)===
29误拦正常请求后: stage=rolled_back hits=1 误伤=1 放过=0 30
31=== 漏拦 → 喂回证据库 ===
| 32 | 窄候选(只拦/admin)回放后: stage=canary hits=2误伤=0放过=7 |
|---|---|
| 33 | 漏拦7条→脱敏后喂回证据库7条 |
| 34 | 证据库: 9条→ 16条 |
| 35 | user:异常证据[path-probe] method=GET path=/wp-admin status=403 uaClass=browse |
| 36 | user:异常证据[path-probe] method=GET path=/etc/passwd status=404 uaClass=brow |
| 37 | 再喂一次: 0条(drain后不再重复) |
38
| 39 | ===喂回→下一轮提案(漏掉的异常请求变成候选)=== |
|---|---|
| 40 | 下一轮提案输入16条证据(原9条+喂回7条);token in=687 out=266 |
| 41 | cand-8 [block admin probe]覆盖率=22.2%精确率=100.0%误伤率=0.0% |
| 42 | cand-9 [block wp admin probe]覆盖率=11.1%精确率=100.0%误伤率=0.0% |
| 43 | ...(cand-a ~ cand-e是/wp-login、/phpmyadmin、/etc/passwd、sqli、ua候选,与上一轮 |
本讲小结
这一讲收尾,实战篇也就此收口:候选规则长出来之后,怎么评测它拦得准不准、上线后怎么靠闭环持续进化?三步走:
- 评测:三种测试一步步逼近真实拦截。模拟测试回放历史流量,看覆盖率 / 精确率 / 误伤
率;阴影测试不影响真实环境;灰度测试小范围真实拦截。后两者共用同一套误伤率度量,沿 shadow → 灰度 → active 逐步推进。拦得好 = 覆盖率高且误伤率低,误伤超阈值回
退、长期无命中老化是两条退路。
- 闭环:漏掉的异常请求脱敏后喂回证据库,和原有证据合并后进入下一轮提案,长成覆盖漏
这背后真正的变化是,规则能被系统化地自动评测了:“拦得好不好”不再靠人的直觉,而是锚在可复现、可对比的计数上。
规则被纳入了完整的自进化闭环:误伤自动回退,漏拦喂回证据库并进入下一轮提案,规则从 “一次写死”变成持续进化的活系统。
注:本讲 GitHub 链接
思考题
动手实操:示例在 src/firewall/ch21/,直接改代码、重跑验证。
把 confirm.ts 的 checkRisk 阈值(0.02)调高,重跑,看 trap-1 会不会从“不通过”
变成“通过”。注意:trap-1 的误伤率是 100%,阈值要调到 ≥1.0 才会翻转;只改 confirm.ts 里 checkRisk 那一处 0.02,别动 demo/rule-eval-demo.ts 里的
fpThreshold。
欢迎把你的运行结果分享出来。如果你觉得这节课对你有帮助,也欢迎分享给其他朋友,我们下节课再见!
© 版权归极客邦科技所有,未经许可不得传播售卖。页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。