第十六章 安全最佳实践与性能优化

1. 学习目标

本章是第四部分与全书的收官——把代码质量(Ch13)、协作流程(Ch14)、DevOps 平台(Ch15)的能力汇总到安全与性能两条横切关注线上。重点解决 AI 辅助开发的两大终极反模式——为了”写得快”绕开安全防线(关 CSP / 关 rate limit / 用过期依赖)和为了”跑得快”做未经测量的过早优化(盲目加缓存、盲目并发、不解释的位运算)。本章把所有规则沉淀为 PR 强制门禁与可执行 runbook,并在 §9.3 给出全书 16-Skill 串联地图。

1.1 学习路径图

graph TD
    A[前置技能检查] --> B[安全与性能理论基础]
    B --> C[OWASP 2021 + 供应链安全]
    C --> D[多语言性能剖析工具链]
    D --> E[Web Vitals + 后端 SLO]
    E --> F[多层缓存与一致性]
    F --> G[k6 性能基准 + Burn Rate]
    G --> H[CI 安全 + 性能门禁]
    H --> I[审查闭环与 16-Skill 地图]

    style A fill:#e1f5fe
    style I fill:#c8e6c9

1.2 预期学习成果

本章结束时应形成 7 项交付物:① OWASP 2021 全栈防御清单(Web/API/容器/IaC 四层);② 多语言性能剖析报告(前端 Lighthouse + 后端火焰图,含优化前后对比);③ 多层缓存设计文档(含 5 类失效场景与一致性策略);④ k6 性能基准 + 回归门禁;⑤ CI 安全扫描流水线(SAST + SCA + Container + IaC + Secret 五合一);⑥ Prometheus SLO + Burn Rate 告警;⑦ secperf-review Skill + 全书 16-Skill 地图(§9.3)。

2. 前置技能检查

维度 必备能力 自检方法
前 15 章全部技能 从 Trae 提示词到 GitOps 部署的完整链路 能独立完成功能从 PR → CI → 灰度 → 生产 SLO 的全流程
浏览器 DevTools Performance / Network / Memory / Lighthouse 能读懂 LCP / INP / CLS 三项 Web Vitals 报告
OWASP 基础 OWASP Top 10 (2021) + API Top 10 (2023) 能解释 BOLA / SSRF / Insecure Design 三类的根因
并发基础 异步、线程池、连接池、锁与无锁 能解释 N+1 查询、惊群、缓存击穿/雪崩/穿透三件套
可观测 Metrics / Logs / Traces 三支柱 能用 PromQL 写出 p95 延迟与错误率

任一项不满足,建议先回到对应章节复习。本章对综合能力要求最高。


3. 理论基础:安全与性能的策略与陷阱

3.1 安全防御纵深(5 层)

层级 关注点 工具 AI 风险
代码层 输入校验、输出编码、Auth/AuthZ、加密 Semgrep / CodeQL / ESLint security AI 默认套示例代码,跳过校验
依赖层 第三方包漏洞、license、typosquat Snyk / Dependabot / OSV-Scanner AI 装新包不查漏洞、不锁版本
容器层 基础镜像 CVE、misconfig、SBOM、签名 Trivy / Grype / cosign / syft AI 用 latest tag、不扫漏洞
平台层 K8s misconfig、RBAC、NetworkPolicy、Secrets Kyverno / OPA / kube-bench AI 默认权限过宽(沿用 Ch15 §3.2)
运行时层 异常 syscall、容器逃逸、流量异常 Falco / Tetragon / WAF AI 几乎不主动建议这一层

对应 OWASP 2021 Top 10:A01 失效访问 / A02 加密失败 / A03 注入 / A04 不安全设计 / A05 安全配置错误 / A06 易受攻击与过时组件 / A07 鉴别与认证失败 / A08 软件与数据完整性失败 / A09 日志与监控失败 / A10 SSRF。

3.2 AI 生成安全/性能代码的六类高频缺陷

类别 典型表现 根因 审查优先级 修正提示词模板(按 Ch2 §4.9
过早优化与未测量假设 未做火焰图就加缓存;用位运算”优化”可读代码;并发数硬编码 AI 倾向”显得高级”,缺乏测量基线 P0 保留功能正确,先建基线(火焰图 / p95)再优化一处。不要动业务输出。验证:优化后 p95 下降 ≥ 10% 且功能回归 0
缓存失效三件套 缓存穿透(查不到的 key 反复打 DB)/ 击穿(单 key 失效瞬间打爆)/ 雪崩(同时失效) AI 默认只设 TTL,不设 negative cache / 过期抖动 P0 保留 cache key 命名,加 singleflight + TTL ±20% jitter + negative cache TTL=60s。不要动读路径。验证:DB 同 key QPS=1;过期分布跨度 > 4min
安全防线被”绕过优化” 为减小响应体关闭 CSP;为减少跳转去掉 rate limit;为快返回跳过校验 AI 把功能跑通优先于安全 P0 保留性能优化思路,恢复 CSP/rate-limit/校验 后单独优化热路径。不要动优化后的热路径。验证:OWASP ZAP 扫描 0 高危
内存与并发资源泄漏 集合无界增长、连接池无上限、goroutine 泄漏、闭包持引用 AI 不写 cleanup/timeout;缺 graceful shutdown P0 保留池/集合语义,加 maxSize + context.WithTimeout + defer cleanup + graceful shutdown。不要动业务逻辑。验证:1h 压测 RSS 稳定
供应链与 secret 失守 装新包不查 CVE;secret 提交进 git;CI artifact 未签名 AI 把示例 token 当字面量;不主动用 SBOM/cosign P0 保留依赖版本,加 SBOM(cyclonedx) + cosign 签名 + secret 扫描(truffleHog)。不要动构建产物。验证:CI scan 0 高危 + 镜像含签名
监控告警与基线缺失 仅有 metric 无 SLO;告警阈值硬编码而非 Burn Rate;性能优化无前后对比 AI 写 rule 但不写 SLO;优化后不复测 P1 保留 metric,加 SLO 定义 + Multi-Burn-Rate Alert + 优化前后对比报告。不要动 metric 名。验证:alert.yaml 含 SLO;复测报告含基线对比

3.3 性能优化的三条铁律

铁律 内涵 AI 高频违反
测量在前 没有 baseline 的优化都是装饰 AI 上来就加缓存/重写算法
优化最热路径 80% 收益来自 20% 代码(火焰图最宽栈) AI 平均使力,不分热度
不为优化牺牲安全 加快 1% 不值得引入注入/鉴权漏洞 AI 关 CSP / rate-limit 换性能

工程铁律:先建 SLO + 基线,再做优化;优化后必须复测;复测必须包含安全回归


4. 技术栈与项目架构

4.1 安全工具栈

类别 选型 最低版本 选型说明
SAST(代码扫描) Semgrep / CodeQL 1.80 / latest Semgrep 规则可写、CodeQL GitHub 原生
SCA(依赖扫描) Snyk / OSV-Scanner / Dependabot latest OSV-Scanner 开源、覆盖最全
容器扫描 Trivy 0.55+ misconfig + secret + SBOM 三合一
IaC 扫描 Checkov / KICS / tfsec 3.2 / latest Checkov 覆盖 Terraform/K8s/Helm
Secret 扫描 gitleaks / trufflehog v3 8.18 / 3.79 trufflehog 含可信度评分
DAST OWASP ZAP 2.15+ 自动化 + 手动模式
镜像签名 cosign / sigstore 2.4+ keyless OIDC 模式生产可用
Web 安全 Headers Helmet (Node) / secure_headers (Py) 7 / 6 CSP / HSTS / X-Frame-Options 一站式
WAF ModSecurity / AWS WAF / Cloudflare latest OWASP CRS 4.x 规则集
Runtime Falco / Tetragon 0.38 / 1.0 eBPF 检测

4.2 性能工具栈

语言 工具 最低版本 选型说明
前端 Lighthouse / WebPageTest 12.x / latest Lighthouse 12 用 INP 替代 FID
浏览器 Chrome DevTools Performance latest Web Vitals 实时面板
Node.js clinic.js / 0x / node –inspect 13 / 5 clinic.js Doctor 自动诊断 5 大问题
Python py-spy / cProfile / scalene 0.4 / 1.5 py-spy 不改代码、scalene 同时分析 CPU/Memory/GPU
Java async-profiler / VisualVM 3.0 / 2.1.10 async-profiler 是火焰图首选
Go pprof / go tool trace go 1.22+ pprof + go tool trace 双件
通用 APM OpenTelemetry + Tempo + Grafana 1.0 / 2.4 复用 Ch12/Ch15 LGTM 栈
负载测试 k6 0.52+ k6 0.52 含 browser API、Web Vitals 测试
HTTP 压测 wrk / hey / autocannon latest 单机简单基线
Web Vitals web-vitals.js 4+ LCP / INP / CLS 真实用户监控(RUM)

4.3 课程项目矩阵(贯穿前 15 章)

项目 来源章节 本章关注点
task-management-api Ch6/13/15 API 鉴权 + N+1 查询 + 缓存层 + k6 基线
realtime-chat Ch10 WebSocket DoS 防御 + 连接池泄漏 + 消息延迟剖析
analytics-dashboard Ch11 NL2SQL 注入 + 大查询超时 + Streamlit 缓存策略
microservice-platform Ch12/15 跨服务认证 + Service Mesh mTLS + SLO/Burn Rate

5. 主框架实战:从安全防线到性能门禁

5.1 OWASP 2021 全栈防御代码模板

5.1.1 Node.js Express 安全 Headers(Helmet 7)

import express from "express";
import helmet from "helmet";
import rateLimit from "express-rate-limit";
import { csrfSync } from "csrf-sync";

const app = express();

// ✅ A05 安全配置 + A02 加密:一行加 11 个安全 headers
app.use(
  helmet({
    contentSecurityPolicy: {
      // ✅ CSP nonce 模式
      directives: {
        defaultSrc: ["'self'"],
        scriptSrc: [
          "'self'",
          (req, res) => `'nonce-${(res as any).locals.cspNonce}'`,
        ],
        styleSrc: ["'self'", "'unsafe-inline'"], // styles 短期允许 inline
        imgSrc: ["'self'", "data:", "https://cdn.example.com"],
        connectSrc: ["'self'", "https://api.example.com"],
        frameAncestors: ["'none'"], // ✅ 防 clickjack
        objectSrc: ["'none'"],
        upgradeInsecureRequests: [],
      },
    },
    strictTransportSecurity: {
      maxAge: 63072000,
      includeSubDomains: true,
      preload: true,
    },
    crossOriginOpenerPolicy: { policy: "same-origin" },
    referrerPolicy: { policy: "strict-origin-when-cross-origin" },
  }),
);

// ✅ A07 鉴别失败:分级速率限制
const authLimiter = rateLimit({
  windowMs: 15 * 60 * 1000,
  max: 10, // 登录 15 分钟 10 次
  standardHeaders: true,
  legacyHeaders: false,
  keyGenerator: (req) => `${req.ip}:${req.body?.username}`, // ✅ IP + 账号双维度
});
app.use("/auth/login", authLimiter);
const apiLimiter = rateLimit({ windowMs: 60_000, max: 100 });
app.use("/api/", apiLimiter);

// ✅ A01 失效访问:CSRF 防御(cookie + header 双 token)
const { csrfSynchronisedProtection } = csrfSync({
  getTokenFromRequest: (req) => req.headers["x-csrf-token"] as string,
});
app.use(csrfSynchronisedProtection);

// ⚠️ AI 经常生成的反例:
// app.use(helmet({ contentSecurityPolicy: false }))         // ❌ 关掉 CSP 换"省事"
// app.disable("x-powered-by") 后没设 helmet                  // ❌ 只擦了一项

5.1.2 输入校验 + ORM 参数化(A03 注入防御)

import { z } from "zod";
import { Prisma } from "@prisma/client";

// ✅ Zod schema 在边界做白名单校验
const ListOrdersQuery = z.object({
  status: z.enum(["pending", "paid", "shipped"]).optional(),
  limit: z.coerce.number().int().min(1).max(100).default(20), // ✅ 限制 max
  cursor: z.string().uuid().optional(), // ✅ uuid 强类型
});

app.get("/api/orders", async (req, res) => {
  const q = ListOrdersQuery.parse(req.query); // ✅ 失败抛异常
  const userId = req.user!.sub; // ✅ 从 JWT 取,绝不从 query

  const orders = await prisma.order.findMany({
    // ✅ Prisma 参数化,无注入
    where: { userId, ...(q.status ? { status: q.status } : {}) },
    take: q.limit,
    ...(q.cursor && { cursor: { id: q.cursor }, skip: 1 }),
    orderBy: { createdAt: "desc" },
  });
  res.json({ data: orders });

  // ⚠️ AI 反例:raw query 拼字符串
  // await prisma.$queryRawUnsafe(`SELECT * FROM orders WHERE user='${userId}'`);
});

A04 不安全设计的核心:信任边界永远从 JWT/Session 取身份,不从 query/body;分页/排序字段必须白名单。

5.2 多层缓存与一致性

// L1: 进程内 LRU + L2: Redis + L3: PG(源)
import LRU from "lru-cache";
import { redis } from "./redis";

const l1 = new LRU<string, Order>({
  max: 1000,
  ttl: 30_000,
  // ✅ 抖动 ±20%,防 L1 同时失效雪崩到 L2
  ttlAutopurge: true,
});

const NEGATIVE = Symbol("not-found");

async function getOrder(id: string): Promise<Order | null> {
  const key = `order:${id}`;
  // 1) L1
  const v1 = l1.get(key);
  if (v1) return v1 === NEGATIVE ? null : v1;

  // 2) L2 Redis(singleflight 防击穿)
  const cached = await redis.get(key);
  if (cached === "__NULL__") {
    l1.set(key, NEGATIVE as any);
    return null;
  } // ✅ 负缓存防穿透
  if (cached) {
    const o = JSON.parse(cached);
    l1.set(key, o);
    return o;
  }

  // 3) singleflight:同 key 并发只查一次 DB(防击穿)
  return await singleflight(key, async () => {
    const o = await prisma.order.findUnique({ where: { id } });
    if (o) {
      const ttl = 300 + Math.floor(Math.random() * 60); // ✅ TTL 抖动防雪崩
      await redis.set(key, JSON.stringify(o), "EX", ttl);
      l1.set(key, o);
      return o;
    } else {
      await redis.set(key, "__NULL__", "EX", 60); // ✅ 负缓存 60s
      l1.set(key, NEGATIVE as any);
      return null;
    }
  });
}

// ✅ 写一致性:先写 DB → 再删缓存(Cache-Aside),异步重试
async function updateOrder(id: string, patch: Partial<Order>) {
  const o = await prisma.order.update({ where: { id }, data: patch });
  await redis.del(`order:${id}`).catch(async () => {
    await deleteRetryQueue.add({ key: `order:${id}` }); // ✅ 删失败入重试
  });
  l1.delete(`order:${id}`); // L1 同步失效
  return o;
}

关键:TTL 抖动防雪崩 + 负缓存防穿透 + singleflight 防击穿——三件套缺一不可。读写顺序选 Cache-Aside(先写 DB 后删缓存),并保证删除失败的重试。

5.3 性能剖析:从 Web Vitals 到火焰图

5.3.1 前端:Lighthouse 12 + Web Vitals RUM

// 真实用户监控(RUM)——补足 Lighthouse 实验室的不足
import { onLCP, onINP, onCLS, onFCP, onTTFB } from "web-vitals/attribution";

function send(metric: { name: string; value: number; attribution: any }) {
  navigator.sendBeacon(
    "/rum",
    JSON.stringify({
      // ✅ unload 安全
      n: metric.name,
      v: metric.value,
      el: metric.attribution.element, // ✅ 哪个 DOM 拖慢
      url: location.pathname,
    }),
  );
}
onLCP(send);
onINP(send);
onCLS(send);
onFCP(send);
onTTFB(send);
指标 优秀 较差 含义
LCP ≤ 2.5 s > 4.0 s 最大内容渲染(首屏)
INP ≤ 200 ms > 500 ms 交互到下一帧(替代 FID)
CLS ≤ 0.1 > 0.25 累积布局偏移
TTFB ≤ 800 ms > 1.8 s 服务器首字节

5.3.2 后端:火焰图驱动的瓶颈定位

# Node.js(clinic.js 自动生成 4 类报告)
clinic doctor    -- node dist/server.js   # CPU / EventLoop / Memory / Handles 综合诊断
clinic flame     -- node dist/server.js   # CPU 火焰图(找最宽栈)
clinic bubbleprof -- node dist/server.js  # 异步操作可视化

# Python
py-spy record -o flame.svg --pid $(pgrep -f gunicorn) --duration 60
scalene --cli --profile-interval 30 my_app.py    # CPU + Memory + GPU 三合一

# Java
java -agentpath:async-profiler/lib/libasyncProfiler.so=start,event=cpu,file=flame.html \
     -jar app.jar

# Go(最简洁)
go tool pprof -http=:8080 http://prod-svc:6060/debug/pprof/profile?seconds=30
go tool trace trace.out                          # 调度器行为

核心心法:最宽栈 = 最热路径。优化它收益最大;不要去优化窄栈,那是装饰。

5.4 k6 性能基准 + 回归门禁

// k6/baseline.js
import http from "k6/http";
import { check, sleep } from "k6";
import { Trend } from "k6/metrics";

const latency = new Trend("api_latency");

export const options = {
  scenarios: {
    smoke: { executor: "constant-vus", vus: 5, duration: "1m" },
    ramp: {
      executor: "ramping-vus",
      startVUs: 0,
      stages: [
        { duration: "2m", target: 100 }, // ramp up
        { duration: "5m", target: 100 }, // sustain
        { duration: "2m", target: 0 },
      ],
    },
    soak: { executor: "constant-vus", vus: 50, duration: "30m" }, // 长时稳定性
  },
  thresholds: {
    // ✅ CI 阻断条件
    "http_req_duration{status:200}": ["p(95)<300", "p(99)<800"],
    http_req_failed: ["rate<0.01"],
    checks: ["rate>0.99"],
  },
};

export default function () {
  const res = http.get(`${__ENV.BASE_URL}/api/orders?limit=20`, {
    headers: { Authorization: `Bearer ${__ENV.JWT}` },
  });
  check(res, {
    "status 200": (r) => r.status === 200,
    "latency<300": (r) => r.timings.duration < 300,
  });
  latency.add(res.timings.duration);
  sleep(1);
}

集成到 CI:在 staging deploy 之后跑 smoke;在 release 前跑 ramp + soak。任一阈值失败 → PR 阻断。

5.5 SLO + Burn Rate 告警(多窗口多倍率)

# prometheus-rules.yaml
groups:
  - name: slo-task-api
    rules:
      # SLO: 30 天 99.9% 成功率
      - record: slo:availability_target
        expr: 0.999

      - record: slo:error_budget_burn_rate1h
        expr: |
          (1 - (
            sum(rate(http_requests_total{job="task-api",code!~"5.."}[1h]))
            / sum(rate(http_requests_total{job="task-api"}[1h]))
          )) / (1 - 0.999)

      - record: slo:error_budget_burn_rate6h
        expr: |
          (1 - (
            sum(rate(http_requests_total{job="task-api",code!~"5.."}[6h]))
            / sum(rate(http_requests_total{job="task-api"}[6h]))
          )) / (1 - 0.999)

      # ✅ 多窗口多倍率:1h 14.4× 触发即"2 天烧光预算"
      - alert: HighErrorBudgetBurn_FastBurn
        expr: slo:error_budget_burn_rate1h > 14.4 and slo:error_budget_burn_rate6h > 6
        for: 2m
        labels: { severity: page }
        annotations:
          {
            summary: "task-api SLO fast burn",
            runbook_url: "https://wiki/runbooks/task-api-burn",
          }

      - alert: HighErrorBudgetBurn_SlowBurn
        expr: slo:error_budget_burn_rate6h > 1 and slo:error_budget_burn_rate1h > 1
        for: 1h
        labels: { severity: ticket }
        annotations: { summary: "task-api SLO slow burn" }

Google SRE Workbook 推荐:fast (1h, 14.4×) + slow (6h, 6×) 双窗口 AND——既能抓快速烧穿、又能避免短暂抖动误报。

5.6 CI 安全 + 性能五合一门禁

# .github/workflows/security-perf-gate.yml
name: Security & Performance Gate
on: [pull_request]
permissions: { contents: read, security-events: write, pull-requests: write }

jobs:
  sast:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      - uses: returntocorp/semgrep-action@v1
        with: { config: "p/owasp-top-ten p/javascript p/typescript p/python" }

  sca:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      - uses: google/osv-scanner-action@v1
        with: { scan-args: "--lockfile=pnpm-lock.yaml --recursive ./" }

  container:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      - run: docker buildx build -t app:$ --load .
      - uses: aquasecurity/trivy-action@master
        with:
          {
            image-ref: "app:$",
            severity: "HIGH,CRITICAL",
            exit-code: "1",
          }
      - run: cosign sign --yes app:$ # ✅ keyless 签名

  iac:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      - uses: bridgecrewio/checkov-action@master
        with: { directory: ".", framework: "terraform,kubernetes,helm" }

  secrets:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }
      - uses: trufflesecurity/trufflehog@main
        with: { extra_args: "--only-verified" } # ✅ 仅高可信度命中

  perf-regression:
    runs-on: ubuntu-22.04
    needs: [sast, sca, container, iac, secrets]
    steps:
      - uses: actions/checkout@v4
      - run: docker compose up -d # 起 staging 副本
      - uses: grafana/k6-action@v0.3
        with: { filename: k6/baseline.js, flags: "--out json=k6.json" }
      - run: node scripts/compare-baseline.js k6.json baseline-main.json # ✅ p95 退化 > 10% 阻断

5.7 Vibe Coding 循环实录:缓存击穿修正

修正语法:「修正提示词」按 Ch2 §4.9 修正提示词语法 模板;3 轮未收敛触发 §4.10。模式选择查 Ch1 §5.4

轮次 AI 输出摘要 发现的缺陷 修正提示词(按 §4.9) 验证信号
R1 高并发同 key 缓存失效瞬间全部回源 DB 同 key QPS 瞬时数千 → 主库 CPU 100% 保留缓存读路径不变,修复回源合并:在 cache miss 路径包 singleflight.Do(key, loader)。原因:同 key 并发回源必须合并为 1。不要改 cache key 命名规则。验证:压测 1000 并发同 key 时 DB 命中数 = 1 DB 同 key QPS = 1
R2 全部 key TTL 固定 600s 批量预热 → 600s 后同时刻雪崩 保留 singleflight,修复 TTL 抖动:TTL 改为 600 + random.randint(-120, 120)(±20% jitter)。原因:固定 TTL 等于同步过期。不要动 singleflight。验证:1 万 key 过期时间分布跨度 > 4 分钟 过期分布 > 4 分钟
R3 不存在的 key 反复查 DB 恶意扫描攻击放大到主库 保留前两层,新增空值缓存:DB 返回 nil 时写入 __NEGATIVE__ sentinel,TTL 60s。原因:必须吸收穿透流量。不要动正常值 TTL。验证:扫描 1000 不存在 key 时 DB QPS < 20 不存在 key DB QPS < 20

收敛信号:合并回源 + TTL 抖动 + 空值缓存三层达标(击穿 / 雪崩 / 穿透三类齐治)。如未收敛触发 §4.10 信号 2(改 A 坏 B:sentinel 误命中真实空业务语义),按「拆步骤」重启——把空值用独立 namespace key 隔离。


6. 进阶速查表

6.1 进阶场景索引

场景 关键技术 AI 高频缺陷 建议提示词关键词
零信任架构 mTLS + SPIFFE / OIDC / OPA 服务间默认信任 “PeerAuthentication STRICT + SPIFFE ID”
API 网关防御 Kong / Envoy + JWT + WAF 鉴权放在业务而非网关 “JWT validation + plugin chain + WAF”
DDoS 缓解 Cloudflare / AWS Shield / CDN 仅靠应用层 rate limit “CDN + WAF + 多层 rate limit”
加密最佳实践 KMS / HSM / Argon2id / TLS 1.3 用 MD5/SHA1 / 密钥硬编码 “KMS + envelope encryption + HSM”
大对象优化 streaming + range + http/3 一次性加载到内存 “streaming + chunked + memory profile”
数据库慢查询 EXPLAIN + index + partition + 读写分离 加缓存绕过慢查 “EXPLAIN ANALYZE + 索引覆盖 + 读副本”
GC 调优 G1/ZGC(Java)/ V8 / Go GC 默认参数高负载抖动 “GC log + heap dump + ZGC/G1”
容器逃逸防御 seccomp + AppArmor + Pod Security 默认 cap、特权容器 “drop ALL + seccomp + read-only fs”

6.2 性能与安全基线

指标 目标值 测量方法
Web LCP ≤ 2.5 s Lighthouse 12 + RUM(75 分位用户)
Web INP ≤ 200 ms RUM 实测
API p95(读) < 300 ms k6 / Prom histogram
API p99 < 800 ms k6
缓存命中率 > 85% Redis info / 自定义 metric
镜像 CVE(HIGH/CRITICAL) 0 Trivy 扫描
Semgrep p/owasp-top-ten violations 0 Semgrep CI
Secret 泄漏 0 trufflehog –only-verified
SLO 30 天可用性 ≥ 99.9% Prometheus + SLO recording
错误预算 fast burn 不触发 Burn Rate alert 1h × 14.4

6.3 运维 Cheatsheet

# 一次性生产体检(每周跑)
trivy image --severity HIGH,CRITICAL ghcr.io/org/app:prod
osv-scanner --lockfile=pnpm-lock.yaml --recursive .
gitleaks detect --redact -v
checkov -d terraform/envs/prod
nuclei -u https://app.example.com -t cves/ -severity high,critical

# 定位线上慢请求(带 traceID 串起来)
curl -H "Traceparent: 00-$(uuid)..." https://app/api/slow      # 注入 traceID
# Grafana → Tempo: 找到 traceID
# Grafana → Loki: 用 traceID 找日志
# Grafana → Prom: 看同时段指标

# 紧急流量保护(按优先级)
1) Cloudflare/WAF 黑 IP / 限速
2) k8s NetworkPolicy 加 deny rule
3) 应用 rateLimit max 临时调小
4) HPA maxReplicas 上调

7. 审查闭环:把安全与性能变成可强制门禁

7.1 四步审查法(安全与性能专用)

步骤 关键检查项
正确性 输入是否经 schema 校验?JWT 校验是否含 iss/aud/exp?缓存 TTL 是否抖动?singleflight 防击穿?SLO/Burn Rate 是否覆盖核心 API?
安全性 OWASP 2021 全 10 项是否有对应防御?helmet/CSP/CSRF/rate-limit 是否完整?依赖是否过 SCA?镜像是否过 Trivy?是否签名(cosign)?
性能 是否有 baseline + 火焰图?最宽栈是否优化?缓存命中率 > 85%?数据库是否有慢日志监控?是否有 k6 回归门禁?
可维护性 secret 是否走 ESO/Vault?告警是否有 runbook 链接?性能优化是否记录前后对比?是否有 SBOM + 依赖图?所有规则是否沉淀为 Skill?

7.2 三类红队攻防场景测试(AI 最容易遗漏)

# 1) BOLA(A01):换 user_id 看能否拿到别人的资源
TOKEN_ALICE=$(login alice)
TOKEN_BOB=$(login bob)
ALICE_ORDER=$(create_order $TOKEN_ALICE)
curl -H "Authorization: Bearer $TOKEN_BOB" /api/orders/$ALICE_ORDER  # ✅ 必须 403

# 2) SSRF(A10):让服务端去访问元数据服务
curl -X POST /api/preview -d '{"url":"http://169.254.169.254/latest/meta-data/"}'  # ✅ 必须拒绝

# 3) 缓存击穿压测:同一个不存在的 key 同时打 1000 次
hey -n 10000 -c 1000 -H "Authorization: Bearer $TOKEN" /api/orders/nonexistent
# ✅ DB QPS 不应被穿透;Redis 应有负缓存命中

7.3 危险模式 grep 规则(沉淀进 secperf-review Skill)

# ============ 安全 ============
# 1. helmet/CSP 被关闭
grep -rEn 'contentSecurityPolicy:\s*false|helmet\(\s*\{\s*contentSecurityPolicy:\s*false' src/

# 2. 弱加密算法
grep -rEn '\b(md5|sha1|des|rc4)\b|crypto\.createHash\(["'\'']md5' src/

# 3. SQL/Shell 字符串拼接
grep -rEn '\$\{[^}]+\}\s*(--|;)|exec\(["'\''].*\$\{|\.query\(`[^`]*\$\{' src/

# 4. JWT 未校验 iss/aud
grep -rEn 'jwt\.verify\([^,]+,[^,]+\)\s*[;,)]' src/   # 没有 options 的就是问题

# 5. secret 形态
grep -rEnE '(api[_-]?key|secret|password|token)\s*[:=]\s*["'\''][A-Za-z0-9+/=]{16,}["'\'']' src/

# ============ 性能 ============
# 6. 缓存无 TTL 抖动
grep -rEn 'redis\.set[a-zA-Z]*\([^)]*EX[\s,]*[0-9]+\s*\)' src/ | grep -v Math.random

# 7. 循环内 await(串行陷阱)
grep -rEn 'for\s*\([^)]*\)\s*\{[^}]*\bawait\b' src/

# 8. 缺 timeout 的 fetch / axios
grep -rEn 'fetch\([^,]+\)|axios\.[a-z]+\([^,]+\)' src/ | grep -v 'AbortSignal\|timeout'

7.4 扫到问题后用什么提示词改?

上面 8 条扫描只识别「安全/性能危信号」;下一步必须按统一语法把意图写回 AI(参照 Ch2 §4.9)。

# 命中后修正提示词模板
1 保留中间件链顺序,启用 helmet({ contentSecurityPolicy: { directives: { defaultSrc:["'self'"], ... } } })。不要动业务 router。验证:响应头含 Content-Security-Policy;Mozilla Observatory 评分 ≥ B+。
2 保留 hash 用途,md5/sha1sha256(数据完整性)或 bcrypt/argon2(密码)。不要动调用点。验证:grep 返 0;提供存量 hash 迁移脚本。
3 保留参数语义,改用占位符(? / $1)+ ORM 安全 API;shell 改 execFile([args]) 避免拼接。不要动业务条件。验证:注入 payload 入库为字面量,shell 不执行额外命令。
4 保留 verify 调用位置,options 加 { algorithms:['RS256'], issuer, audience }。不要动 token 结构。验证:错误 iss/aud 返 401 + code='ISS_MISMATCH'
5 保留调用点,secret 迁 process.env + .env.example + KMS;启动检查缺失就 throw。不要动算法。验证:grep 返 0;重启后新 secret 生效。
6 保留 cache key 命名,TTL 改 base + Math.floor(Math.random()*base*0.2)(±20% jitter)+ singleflight + negative cache TTL=60s。不要动读路径。验证:DB 同 key QPS = 1;过期分布跨度 > 4min。
7 保留任务列表,串行改并发 await Promise.allSettled(items.map(fn))p-limit(N) 控制并发。不要动错误处理语义。验证:N=100 场景耗时下降 ≥ 5×。
8 保留 URL 与 body,axios 加 { timeout: 3000 } 或 fetch AbortSignal.timeout(3000) + 3 次退避重试。不要动重试语义中的幂等性。验证:模拟挂起服务 3.5s 内返错而非 hang。

3 轮未收敛触发 §4.10 的「换模式 / 缩范围 / 拆步骤」。


8. 三档实践

8.1 基础实践(必做)

为第六章 task-management-api 补齐安全与性能:① OWASP 2021 全栈防御(helmet + CSP nonce + CSRF + rate limit 分级 + Zod 校验);② Lighthouse 12 跑分 ≥ 90 + 后端 k6 baseline;③ Redis 多层缓存(含 TTL 抖动 / 负缓存 / singleflight);④ CI 五合一安全门禁(SAST + SCA + Container + IaC + Secret)。

8.2 进阶实践(推荐)

为第十章实时聊天 + 第十一章分析仪表板做深度优化:① WebSocket 连接泄漏诊断(clinic.js + heap snapshot)+ 修复;② DuckDB 大查询超时与背压;③ Streamlit st.cache_data vs st.cache_resource 选型并量化收益;④ SLO + Burn Rate(fast 1h 14.4× / slow 6h 6×)告警 + runbook;⑤ k6 回归门禁集成到 CD(p95 退化 > 10% 阻断);⑥ 真实用户监控 RUM 上线,输出”Lighthouse vs RUM”对比报告。

8.3 开放实践(挑战 / 全书集大成)

为第十二章微服务平台 + 第十五章 GitOps 体系做安全与性能终局加固:① 落地零信任(mTLS STRICT + SPIFFE + OPA Authz);② 跨服务追踪(OTel + Tempo)+ 一次端到端故障演练;③ 红队攻防演练(BOLA / SSRF / 缓存击穿三类);④ 依赖供应链 SLSA Level 3(cosign keyless + SBOM + provenance);⑤ Kyverno admission 强制 §7.3 八条规则;⑥ 把全书 Skill 整理为 .qoder/skills/secperf-review/SKILL.md + 全书 16-Skill 串联地图(见 §9.3)。


9. 小结

9.1 章节交付物清单

编号 交付物 复用去向
D-16-1 OWASP 2021 全栈防御代码模板(helmet/CSRF/rate limit) 全书所有 API 项目复用
D-16-2 多层缓存 + TTL 抖动 + 负缓存 + singleflight Ch6/Ch10/Ch11/Ch12 缓存层基线
D-16-3 多语言性能剖析 runbook(前端 RUM + 后端火焰图) 全书性能分析方法论
D-16-4 k6 性能基准 + 回归门禁 Ch15 CD 链路必备节点
D-16-5 CI 五合一安全门禁(SAST/SCA/Container/IaC/Secret) Ch14/Ch15 PR 流程必备
D-16-6 SLO + Burn Rate 告警 + runbook Ch12/Ch15 可观测能力终态
D-16-7 secperf-review Skill + 全书 16-Skill 地图 团队 PR 审查规约总入口

9.2 安全与性能能力自评 Rubric

维度 入门(1-2) 熟练(3-4) 精通(5)
安全编码 知道 OWASP 名词 能独立加 helmet + CSRF + rate limit + Zod 校验 能落地零信任 + SLSA Level 3 + 红队攻防演练
性能剖析 跑过 Lighthouse 能用火焰图找最宽栈 + 量化优化收益 能从 RUM → APM → 火焰图全链路定位 + 设计性能门禁
缓存设计 加过 Redis 能设 TTL 抖动 + 负缓存 + singleflight 能设计多层 + 一致性策略 + 可解释失效模式
监控告警 看 Grafana 能写 PromQL + Alertmanager rules 能设计 SLO + 多窗口多倍率 Burn Rate + runbook
审查能力 跑 §7.3 grep 识别六类缺陷 + 跑红队三类演练 输出可复用 Skill + 团队规约 + Kyverno admission

9.3 全书 16-Skill 串联地图(capstone)

贯穿这 16 个 Skill 的主骨是 Vibe Coding 闭环:描述意图 → AI 生成 → 审查迭代 → 交付。每个 Skill 只是「审查迭代」环节的专领域拦截器:Chx §3.2 的缺陷表与第 5 列修正提示词告诉 Skill 抓什么与怎么跟 AI 谈;Chx §5.x 循环实录表告诉 Skill 一轮快、三轮慢、何时重启;Chx §7.x 危险模式扫描 + 修正提示词表告诉 Skill 以哪些 grep 作 PR 闸门。离开闭环主骨,Skill 就只是一堆禁用项,而非工程方法论。

Skill 章节 PR 触发条件 关键检查 Vibe Coding 调用点
prompt-template-set Ch1-3 任意 Trae 提示词改动 提示词是否含上下文 + 约束 + 输出格式 「描述意图」环节
frontend-review Ch5 apps/web/** 可访问性 + Web Vitals + 状态管理 「审查迭代」+ Ch5 §7.4 修正表
api-review Ch6 services/*/api/** OpenAPI + Zod + RESTful + 鉴权 「审查迭代」+ Ch6 §7.3 修正表
sql-review Ch7 **/*.sql、ORM 查询 EXPLAIN + 索引 + N+1 + 参数化 「审查迭代」+ Ch7 §7.3 修正表
security-review Ch8 auth/middleware/ JWT iss/aud/exp + RBAC + CSRF 「审查迭代」+ Ch8 §7.4 修正表
inference-review Ch9 **/llm/****/prompts/** 越狱防御 + token 控制 + 缓存 「审查迭代」+ Ch9 §7.4 修正表
realtime-review Ch10 **/ws/****/socket/** 心跳 + 背压 + 断线重连 + 防 DoS 「审查迭代」+ Ch10 §7.4 修正表
analysis-review Ch11 **/notebooks/****/dashboards/** dtype + 时区 + 单位 + p-hacking 「审查迭代」+ Ch11 §7.4 修正表
microservice-review Ch12 services/*、Helm chart DDD 边界 + Outbox + Saga + Istio 「审查迭代」+ Ch12 §7.4 修正表
quality-review Ch13 tests/eslint.config.js 强断言 + mutation score + 假绿验证 「审查迭代」+ Ch13 §7.4 修正表
pr-review Ch14 .github/、Branch Protection Conventional Commits + CODEOWNERS + 高风险检查 「交付」+ Ch14 §7.4 修正表
devops-review Ch15 **/*.yamlDockerfile*.tf limits + probes + nonRoot + PDB + 镜像 digest 「交付」+ Ch15 §7.4 修正表
secperf-review Ch16 全仓库(最后一道闸) OWASP + 缓存三件套 + SLO + Burn Rate + 五合一扫描 「交付」+ Ch16 §7.4 修正表
vibe-loop-set Ch1+Ch2 任意 Skill 出现 3 轮未收敛 Ch1 §5.4 三模式决策树 + Ch2 §4.9 / §4.10 贯穿所有环节的闭环骨架

实施建议:在 .qoder/skills/ 下为每个 Skill 写一个 SKILL.md,含触发器、检查项、自动化命令;用 GitHub label-based dispatch 在 PR 上挂上对应 Skill。额外为 vibe-loop-set 写一个 meta-Skill:定义「3 轮仓库重复修改」的检测与提醒脚本,以避免 AI 陷入越修越乱。

9.4 跨章节衔接与全书结尾

  • ⬅️ Ch13/Ch14/Ch15:本章是这三章的总检查口——质量门禁 → 协作门禁 → DevOps 门禁 → 安全/性能门禁;
  • ⬅️ Ch5-Ch12:本章为前面所有项目补齐安全与性能能力;
  • 🏁 全书完结:从 Ch1 的”AI 编程世界观”到 Ch16 的”全书 Skill 地图”,目标是把 AI 协作沉淀为团队 systematized 的工程方法论而非个人灵感。

10. 延伸阅读

10.1 经典必读(建立终极直觉)

  • 《Site Reliability Engineering》+《SRE Workbook》(Google)— SLO / 错误预算 / Burn Rate 的圣经
  • 《Designing Data-Intensive Applications》(Martin Kleppmann)— 大型系统的可靠性、性能、扩展性
  • 《Web Application Hacker’s Handbook》(第 2 版)— Web 安全攻防
  • 《The Tangled Web》(Michal Zalewski)— 浏览器与 Web 安全的细节
  • 《Systems Performance》(第 2 版,Brendan Gregg)— 性能分析方法论与火焰图作者作品
  • 《BPF Performance Tools》(Brendan Gregg)— eBPF 时代的性能工具集

10.2 工程化与官方规范

10.3 前沿研究与实践报告

  • Google SRE Workbook — 多窗口多倍率告警源头
  • Verizon Data Breach Investigations Report(DBIR,每年最新版)— 真实漏洞利用统计
  • Sonatype State of the Software Supply Chain — 依赖漏洞趋势
  • Cloud Native Computing Foundation State of Cloud Native Security
  • Brendan Gregg’s Blog:https://www.brendangregg.com/(性能与火焰图前沿)
  • Chrome DevTools Tips:https://developer.chrome.com/docs/devtools/(Web Vitals + INP 调优)

完成判定:能在 30 分钟内为新项目搭好 ① OWASP 防御四件套;② 多层缓存三件套;③ k6 baseline + Burn Rate;④ CI 五合一扫描;并通过 §7.2 三类红队场景演练。当你能让”AI 写得既快又安全又高效”——并且这是被门禁强制保障而非靠人盯——这门课就完成了它的使命。