第 7 章 · 01 框架专项(Django / FastAPI / NestJS / Next.js) 本节摘要:通用 Web 漏洞讲的是「面」,框架专项讲的是「点」。每个主流 Web 框架都有自己的特有攻击面:Django 的 会把 、数据库连接串、已装应用一股脑塞进黄色调试页;FastAPI 默认把 当成生产接口暴晒;NestJS 的守卫栈(global → controller → method)只要某个 handler 漏挂 就敞开大门;Next.js 的 Server Action 鉴权常常依赖客户端状态而非服务端强制。本节合并 Django、FastAPI、NestJS、Next.
本节摘要:通用 Web 漏洞讲的是「面」,框架专项讲的是「点」。每个主流 Web 框架都有自己的特有攻击面:Django 的
DEBUG=True会把SECRET_KEY、数据库连接串、已装应用一股脑塞进黄色调试页;FastAPI 默认把/openapi.json当成生产接口暴晒;NestJS 的守卫栈(global → controller → method)只要某个 handler 漏挂@UseGuards就敞开大门;Next.js 的 Server Action 鉴权常常依赖客户端状态而非服务端强制。本节合并 Django、FastAPI、NestJS、Next.js 四个框架的安全测试要点,聚焦「配置泄露点、错误配置、栈特有攻击面」,让你在真实目标上精准命中框架的软肋。
⚠️ 仅限授权测试:本节所有技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。
阅读完本节,你应当能够:
DEBUG、SECRET_KEY、ALLOWED_HOSTS)与 DRF 序列化器/权限类缺口。__NEXT_DATA__ 过度暴露。Django 的默认相对安全(CSRF 中间件、模板自动转义),但 DRF、原始 SQL、自定义权限、部署配置常常引入缺口。攻击面集中在四块:配置泄露、权限/会话、注入、序列化器与对象级权限。
urls.py 路由、类视图与函数视图、中间件栈;ORM(filter、Q、extra、RawSQL);模板(Django 模板 / Jinja2 后端);表单与 DRF 序列化器。AuthenticationMiddleware、@login_required、DRF permission_classes;Token / JWT(djangorestframework-simplejwt);Django admin(/admin/)。DEBUG=True 暴露、ALLOWED_HOSTS、SECRET_KEY 泄露;静态/媒体服务、反向代理、ASGI(Channels / Daphne / Uvicorn)。/admin/(爆破、撞库、对象 IDOR);混合权限类的 ViewSet;文件上传与导入导出(django-import-export);搜索/过滤端点(filter()、Q、原始 SQL);密码重置/邀请令牌;WebSocket consumers(常比 HTTP 鉴权更弱);Celery 任务接收用户 ID 但不校验归属。Django 最经典的栈特有问题就是 DEBUG=True 进了生产。触发任意异常后,黄色调试页会泄露:
SECRET_KEY(可伪造签名 cookie、密码重置令牌)指纹与探测:
curl -I https://target/ -H "Cookie: sessionid=test" # 关注 X-Frame-Options、Set-Cookie(sessionid/csrftoken)、Server 头 GET /admin/login/ GET /api/ /api/v1/ /swagger/ /api/schema/
/static/、带堆栈的错误页同样会暴露路径与 ORM 查询。DRF 的 OpenAPI 也是金矿:
GET /api/schema/ GET /swagger.json
可逐路由映射 authentication_classes 与 permission_classes,直接找出哪些路由没挂权限。
权限类缺口:ViewSet 常见「保护了 list、忘了 retrieve/update」;自定义权限只校验「是否登录」不校验「对象归属」(IDOR);@api_view 不显式声明权限就继承宽松默认值;admin 动作或自定义管理命令不带 staff 校验。
会话问题:SESSION_COOKIE_SECURE=False(HTTPS 站点)、缺 HttpOnly;登录后未轮换 session key(会话固定);SECRET_KEY 弱或泄露 → 伪造会话 cookie(尤其是 signed_cookies 后端)。
JWT(simplejwt):RS256→HS256 算法混淆(未钉死算法时);登出未把 user_id/token 拉黑;刷新令牌未强制轮换。
ORM SQL 注入(老代码常见):
User.objects.raw(f"SELECT * FROM auth_user WHERE username = '{user_input}'") User.objects.extra(where=[f"username = '{user_input}'"])
测试 payload:' OR 1=1 --、时间盲注、数据库特定语法。
DRF 过滤后端:django-filter 字段暴露不安全,如 ?username__icontains= 打到非预期列;?ordering= 注入(字段白名单缺失时)。
模板注入:Django 模板默认自动转义,危险来自:
mark_safe(user_input) |safe 过滤器 Template(user_input).render(...) # 用户控制模板源 → SSTI
Jinja2 后端关闭自动转义时,{{7*7}} 即可触发,沙箱配错则有 RCE gadget。
CSRF:@csrf_exempt 标在状态变更视图上;DRF 会话认证对不安全方法不强制 CSRF;CSRF_TRUSTED_ORIGINS 过宽。测试:跨源 POST 携带受害者会话 cookie,JSON 端点 + 会话认证尤其要测。
DRF 序列化器:fields = '__all__' 暴露 is_staff、is_superuser、role、balance;敏感字段缺 read_only_fields;嵌套写跨租户更新外键。
对象级权限:get_object() 未按 request.user 过滤 queryset;通用视图 queryset = Model.objects.all() 配弱权限。
7*7 等价物。沙箱自带 python/pipx、semgrep、bandit、ast-grep、ripgrep:
bandit -r . -ll — 标记 mark_safe、extra()、RawSQL、弱加密、硬编码密钥。semgrep --config p/django . — 比 bandit 更针对框架(.extra()、RawSQL、|safe、csrf_exempt、ALLOWED_HOSTS=['*'])。ast-grep run -p 'mark_safe($X)' -l python — 结构化快速 grep。pip-audit — 依赖 CVE 扫描 Django/DRF/simplejwt 版本。💡 Pro Tips:DRF ViewSet 常保护
list却忘了destroy或自定义@action;APIView子类缺permission_classes是高频疏漏;?format=与可浏览 API 的 HTML 响应在会话认证下要测 CSRF;django.contrib.admin用独立认证,别假设 API 认证覆盖 admin;ASGI WebSocket consumer 要和 REST 同资源的权限对比。
FastAPI/Starlette 的攻击面集中在:依赖注入鉴权漂移、OpenAPI 信息泄露、Pydantic 输入处理、CORS/CSRF、代理与 Host 信任、模板注入、SSRF、WebSocket 与挂载子应用。
APIRouter 前缀/标签、挂载 StaticFiles、admin、include_router、版本化路径);依赖注入(Depends、Security、OAuth2PasswordBearer、HTTPBearer、scopes)。UploadFile/File/FileResponse/StaticFiles;Jinja2Templates。StreamingResponse;BackgroundTasks 与任务队列。/openapi.json、/docs、/redoc(完整攻击面地图、securitySchemes、server URL);token 端点、会话/cookie 桥接、OAuth device/PKCE;admin/staff 路由、feature-flag 路由、include_in_schema=False 的端点;文件上传/下载、导入导出、签名 URL 生成器;WebSocket 端点;后台任务端点(/jobs/{id});挂载子应用(admin UI、存储浏览器、metrics)。FastAPI 默认把 OpenAPI 暴晒。生产环境若未关闭:
GET /openapi.json GET /docs GET /redoc GET /api/openapi.json GET /internal/openapi.json
提取 paths、parameters、securitySchemes、scopes、servers。include_in_schema=False 的端点不会出现——按已发现前缀和常见 admin/debug 名 404 fuzz。
依赖映射是 FastAPI 鉴权测试的核心。对每条路由,识别:
依赖注入缺口:路由漏挂其他路由都有的安全依赖;用 Depends 而非 Security(忽略 scope 强制);「token 存在」被当成「已认证」而不验签;OAuth2PasswordBearer 只吐 token 字符串——要确认路由没把「存在」当鉴权。
JWT 误用:解码不验签(测无签名 token、攻击者签名 token);算法混淆(HS256/RS256 未钉死);kid 头注入到自定义 key 查找路径;缺 issuer/audience 校验、跨服务 token 复用。
会话弱配:SessionMiddleware 用弱 secret_key;可预测签名导致的会话固定;cookie 鉴权缺 CSRF 保护。
IDOR via 依赖:路径/查询里的对象 ID 未按调用者校验;租户 header 被信任却未绑定到已认证用户;BackgroundTasks 操作 ID 时执行期未重新校验归属;导入导出流水线 IDOR 与跨租户泄露。
Scope 绕过:最小 scope 满足(任何合法 token 都接受);路由级 vs 路由项级 scope 强制不一致。
Pydantic 利用:类型强制(string→int/bool、空串→None、truthiness 边界);extra = "allow" 允许注入控制字段(role、ownerId、scope);union/Annotated 构造命中非预期校验分支。
Content-Type 切换:
application/json ↔ application/x-www-form-urlencoded ↔ multipart/form-data
不同 content-type 命中不同校验器或代码路径(解析器差异)。头部/cookie 名大小写变体、重复参数利用 DI 优先级、X-HTTP-Method-Override 方法覆盖(上游尊重、应用不尊重)都是常见绕过。
CORS 错配:allow_origin_regex 过宽;Origin 反射不校验;带凭证的请求配宽松 origin;对比 preflight 与真实请求的差异。
CSRF 暴露:FastAPI/Starlette 无内置 CSRF;cookie 鉴权缺 origin 校验;缺 SameSite。
头部伪造:无网络边界的 ProxyHeadersMiddleware——伪造 X-Forwarded-For/Proto 影响鉴权/IP 门控;缺 TrustedHostMiddleware 的 Host 头投毒(密码重置链接、绝对 URL 生成);缓存 key 混淆(缺 Vary on Authorization/Cookie/Tenant)。
模板注入(Jinja2):
{{7*7}} # 算术确认 {{cycler.__init__.__globals__['os'].popen('id').read()}} # RCE
检查自动转义与自定义 filter/global。
SSRF:导入/预览/webhook 校验中的用户 URL;测 loopback、RFC1918、IPv6、重定向、DNS rebinding、头部控制;httpx/requests 的重定向策略、头部转发、协议支持;file://、ftp://、gopher 类垫片(自定义 client 时)。
文件上传:UploadFile.filename 含控制字符的路径穿越;缺存储根强制、跟随符号链接;变体文件名编码、点段、NUL 类字节。
WebSocket:缺每连接认证;跨源 WebSocket 无 origin 校验;topic/channel IDOR(订阅他人 channel);只在握手鉴权、不逐消息。
挂载子应用:/admin、/static、/metrics 的子应用可能绕过全局中间件。验证所有挂载点的鉴权对等。若挂了 GraphQL(Strawberry/Graphene),验证 resolver 级鉴权与 node/global ID 的 IDOR;若有 SQLModel/SQLAlchemy,探原始查询与行级鉴权缺口。
💡 Pro Tips:FastAPI 的「依赖存在 ≠ 鉴权存在」——
Depends(get_token)只是把 token 取出来,验签和授权是你自己的事;/docs在 dev 司空见惯,在 prod 就是攻击面地图;Pydantic 的extra="allow"是隐形批量赋值。
NestJS 的攻击面集中在:装饰器栈(global → controller → method)的守卫断点、Validation Pipe 绕过、模块边界泄露、跨传输(HTTP/WebSocket/微服务)鉴权不一致。
@UseGuards、CanActivate、执行上下文 HTTP/WS/RPC、Reflector 元数据);管道(ValidationPipe 的 whitelist/transform/forbidNonWhitelisted、ParseIntPipe、自定义 pipe);拦截器(响应映射、缓存、日志、超时);过滤器(可能泄露信息的异常过滤器);元数据(@SetMetadata、@Public()、@Roles()、@Permissions())。@Module 边界、provider 作用域(DEFAULT/REQUEST/TRANSIENT);动态模块 forRoot/forRootAsync;DI 容器(provider override、自定义 provider)。@Controller、版本化 URI/Header/MediaType);GraphQL(@Resolver、playground/sandbox 暴露);WebSocket(@WebSocketGateway、gateway 守卫、room 鉴权);微服务(TCP、Redis、NATS、MQTT、gRPC、Kafka——常缺 HTTP 级鉴权)。$queryRaw、$queryRawUnsafe);Mongoose(操作符注入、$where、$regex)。@nestjs/passport 策略、@nestjs/jwt、会话认证;@nestjs/config、ConfigService、.env;@nestjs/throttler、@SkipThrottle;@nestjs/swagger(OpenAPI 暴露、DTO schema、auth scheme)。/api、/api-docs、/api-json、/swagger);认证端点(登录、注册、刷新、密码重置、OAuth 回调);带 @Roles('admin') 的 admin 控制器(用 user 级 token 测);FileInterceptor/FilesInterceptor 上传;共享业务逻辑的 WebSocket gateway;@MessagePattern/@EventPattern 微服务 handler(常无守卫);CRUD 生成器(@nestjsx/crud);后台任务与定时任务(@nestjs/schedule);健康/metrics(/health、/metrics);GraphQL playground(/graphql)。NestJS 鉴权的头号缺陷就是装饰器栈缺口:
@UseGuards(兄弟方法都挂了)是头号发现。@Public() 元数据让全局 AuthGuard 跳过——检查是否应用过宽。ExecutionContext 切换:只处理 HTTP 上下文(getRequest())的守卫,在 WebSocket 或 RPC 上可能静默失败、默认返回 true。同一业务逻辑走不同传输,常能找到上下文专属绕过。
Reflector 不匹配:守卫读 SetMetadata('roles', [...]) 但装饰器写的是 'role'(单数)——守卫看不到元数据,默认放行。applyDecorators() 组合可能意外用宽松守卫覆盖严格守卫。
Whitelist 绕过:whitelist: true 但没 forbidNonWhitelisted: true——额外属性被静默剥离,但可能已被更早的中间件/拦截器处理。嵌套对象缺 @Type(() => ChildDto):@ValidateNested() 不配 @Type 等于嵌套 payload 完全不校验。数组:@IsArray() 不配 @ValidateNested({ each: true }) + @Type 不校验元素。
类型强制:transform: true 开启隐式强制(string→number、"true"→true、"null"→null);利用下游业务逻辑的 truthiness 假设。
条件校验:@ValidateIf() 与校验组造出字段完全跳过校验的路径。
缺 Parse Pipe:@Param('id') 不配 ParseIntPipe/ParseUUIDPipe——字符串值直达 ORM 查询。
JWT 策略:检查 ignoreExpiration 是否 false、algorithms 是否钉死(无 none 或 HS/RS 混淆);弱 secretOrKey;跨服务 token 复用(audience/issuer 未强制)。
Passport 策略问题:validate() 返回值变成 req.user——若返回完整 DB 记录,敏感字段向下游泄露;多策略(JWT + 会话)可能互相绕过限制;自定义守卫对未认证返回 true 当「可选认证」。
计时攻击:本地策略用明文字符串比较而非 bcrypt/argon2。
序列化泄露:未全局应用 ClassSerializerInterceptor 时,@Exclude() 字段(密码、内部 ID)被返回;@Expose() 配组时,admin 专属字段在未按请求强制组时暴露;eager 加载的 TypeORM/Prisma 关系暴露整个对象图。
拦截器滥用:CacheInterceptor 不把用户/租户身份放进缓存 key——一个用户的响应发给另一个(先认证请求、再未认证请求拿缓存);响应映射拦截器映射不全则泄露内部实体字段。
全局模块暴露:@Global() 模块把所有 provider 暴露给每个模块,无需显式 import;敏感服务(admin 操作、内部 API)从不可信模块可达。
配置泄露:forRoot/forRootAsync 的配置密钥,可通过任意模块注入 ConfigService 访问。
作用域问题:REQUEST 作用域 provider 误配成 DEFAULT(单例)——请求上下文在并发请求间泄露。
WebSocket Gateway:HTTP 守卫不会自动应用到 WebSocket gateway——@UseGuards 必须显式;鉴权从 handleConnection 延迟到消息 handler,允许未认证发消息;room/namespace 鉴权:用户加入不该访问的 room;@SubscribeMessage() handler 依赖连接级认证而非逐消息校验。
微服务传输:@MessagePattern/@EventPattern handler 常无守卫(被视为「内部」);若传输(Redis、NATS、Kafka)网络可达,可注入消息绕过全部 HTTP 安全;ValidationPipe 可能只配 HTTP——微服务 payload 跳过校验。
TypeORM:QueryBuilder 与 .query() 用模板字符串插值 → SQL 注入;relations:API 允许通过查询参数指定加载哪些关系。
Mongoose:查询操作符注入({ password: { $gt: "" } } 经未净化请求体);$where、$regex 来自用户输入。
Prisma:$queryRaw/$executeRaw 用字符串插值(非 tagged template);$queryRawUnsafe。
限流:敏感端点(登录、密码重置、OTP)上的 @SkipThrottle();内存 throttler 存储:重启即重置、跨实例失效;代理后未 trust proxy:所有请求共享同一 IP,或头部可伪造。
CRUD 生成器:自动生成的 CRUD 端点可能不继承手工守卫配置;批量操作(createMany、updateMany)绕过逐实体鉴权;CRUD 库的查询参数注入(filter、sort、join、select)暴露非授权数据。
绕过手法:@Public() / 跳过元数据经组合装饰器在 method 级应用,使全局守卫经 Reflector 元数据检查跳过;路由参数污染 /users/123?id=456(守卫 vs handler 谁的 id 胜出?);版本路由 v2 加了守卫、v1 没加;X-HTTP-Method-Override 或 _method 在守卫之前被 Express 处理;content-type 切换绕过 JSON 专属校验;异常过滤器差异:守卫抛错变成泛化错误,泄露路由存在性。
验证要求:守卫绕过(无认证请求访问受保护端点成功,展示守卫链断点);校验绕过(额外/畸形字段影响业务逻辑);跨传输不一致(同一操作 HTTP 鉴权但 WebSocket/微服务可利用);模块边界泄露;序列化泄露(响应含 @Exclude 字段);IDOR(两用户旁路请求);ORM 注入;缓存投毒。
💡 Pro Tips:NestJS 的「守卫存在 ≠ 守卫生效」——
@Public()一行注释就能让全局守卫跳过;WebSocket 和微服务 handler 是 HTTP 守卫的盲区,务必走一遍同样业务逻辑的 WS/RPC 路径;ValidationPipe的whitelist不配forbidNonWhitelisted是「静默吞字段」,看起来安全实则已被拦截器处理过。
Next.js 的攻击面集中在:运行时(Edge/Node)鉴权漂移、缓存边界、Server Action、中间件绕过。App Router 与 Pages Router 常共存,鉴权可能在两套路由间不一致。
app/)与 Pages Router(pages/)常共存;Route Handler(app/api/**)与 API 路由(pages/api/**);项目根的 middleware.ts。Next-Action 头的流式 POST);getServerSideProps、getStaticProps。next/image 优化与远程 loader。remotePatterns/domains;NextAuth 回调(/api/auth/callback/*)、登录 provider;Edge 专属功能(bot 保护、IP 门控)及其 Node 等价物。Next.js 的侦察很大程度靠客户端 bundle 挖掘:
// 浏览器控制台 - 列出所有路由 console.log(__BUILD_MANIFEST.sortedPages.join('\n')) // 检查服务端取的数据 JSON.parse(document.getElementById('__NEXT_DATA__').textContent).props.pageProps // 列出公开环境变量 Object.keys(process.env).filter(k => k.startsWith('NEXT_PUBLIC_'))
构建产物:
GET /_next/static/<buildId>/_buildManifest.js GET /_next/static/<buildId>/_ssgManifest.js GET /_next/static/chunks/pages/ GET /_next/static/chunks/app/
chunk 文件名映射到路由(如 admin.js → /admin)。检查 /_next/static/ 下是否有暴露的 .map 文件,泄露路由结构、server action ID、内部函数。
客户端 bundle 挖掘:在 main-*.js 搜 pathname:、href:、__next_route__、serverActions、API 端点;grep API_KEY、SECRET、TOKEN、PASSWORD 找意外泄露的凭证。
Server Action 发现:Network 面板看带 Next-Action 头的 POST,从响应流和水合数据提取 action ID。
额外泄露:/sitemap.xml、/robots.txt、/sitemap-*.xml 找非预期 admin/internal/preview 路径;客户端 bundle/env 找秘密路径与 preview/admin 标志(很多团队只用 UI 隐藏路由)。
已知技术:x-middleware-subrequest 头构造(CVE 级绕过);x-nextjs-data 探测;留意 307 + x-middleware-rewrite/x-nextjs-redirect 头。
路径规范化:
/api/users /api/users/ /api//users /api/./users
中间件的规范化可能与路由处理器不同。测双斜杠、尾斜杠、点段。
参数污染:?id=1&id=2、?filter[]=a&filter[]=b——中间件查第一个值,handler 用最后一个或数组。
Server Action:在 UI 流程外用替代 content-type 调用 action;鉴权依赖客户端状态而非服务端强制;action payload 里的对象引用导致 IDOR;从 source map 映射 action ID 发现隐藏 action。
缓存边界失败:用户绑定数据无身份 key 缓存(无 ETag/Set-Cookie 感知);个性化内容从共享缓存/CDN 提供;敏感 fetch 缺 no-store。
Flight Data 泄露:检查流式 RSC payload 的 props 里序列化的敏感字段。
ISR 问题:stale-while-revalidate 响应含用户专属或租户相关数据;按需重验证端点 URL 的弱密钥;Referer 泄露的 token 或未校验 host 触发 revalidatePath/revalidateTag;头部走私或方法变体触发重验证。
NextAuth 陷阱:每个 provider 缺/松 state/nonce/PKCE(登录 CSRF、token 混淆);callbackUrl 开放重定向或 allowed hosts 范围过宽;跨路由未强制 JWT audience/issuer;跨服务 token 复用;强制回调劫持会话。
会话边界:App Router 与 Pages Router 之间鉴权不一致;API 路由 vs Route Handler 鉴权不一致。
__NEXT_DATA__ 过度获取:服务端取的数据传给客户端却不渲染——只需要用户名却传整个 user 对象;内部 ID、token、admin 专属字段;ORM select-all 模式暴露整条记录;API 响应未净化转发(元数据、游标、调试信息)。
环境相关暴露:staging/dev 意外暴露比 prod 更多字段;跨环境序列化逻辑不一致。
Props 检查:
JSON.parse(document.getElementById('__NEXT_DATA__').textContent).props
找 _metadata、_internal、__typename(GraphQL)、嵌套敏感对象。
Remote Patterns:next.config.js 里宽泛的 images.domains/remotePatterns;测内部主机、IPv4/IPv6 变体、DNS rebinding。
自定义 Loader:重定向链的协议走私;URL 规范化差异影响其他用户的缓存投毒。
运行时分叉(Edge vs Node):依赖 Node 专属模块的防御在 Edge 上被跳过;头部信任不同(x-forwarded-* 处理);同一路由跨运行时行为不同。
客户端 XSS:dangerouslySetInnerHTML;Markdown 渲染器;用户可控 href/src 属性;验证 SSR/CSR/hydration 的 CSP/Trusted Types 覆盖;服务端 vs 客户端渲染差异可启用 gadget 型 XSS。
Draft/Preview 模式:启用 preview 的秘密 URL/cookie;preview 密钥泄露在客户端 bundle/env;从子域或经开放重定向设置 preview cookie。
__NEXT_DATA__ 暴露:验证跨用户(用户 A 的 props 不该含用户 B 的 PII),确认暴露字段不在 DOM。💡 Pro Tips:Next.js 的中间件是「请求级」的,路由处理器是「处理级」的——两者路径规范化不一致就是绕过;
__NEXT_DATA__是被低估的金矿,很多团队把整条 ORM 记录塞进去;Server Action 的鉴权常常「假设客户端不发就不会调」,实际只要有 action ID 就能 POST。
DEBUG=True 进生产 = 黄色调试页泄露 SECRET_KEY/DB 连接串/已装应用;DRF 的 /api/schema/ 是逐路由权限地图。list 忘了 destroy;fields='__all__' 暴露 is_staff/is_superuser;get_object() 不按 request.user 过滤 = IDOR。.raw(f"...{user_input}...")、.extra(where=[...])、mark_safe()、|safe、Template(user_input).render() 是四大嫌疑点;bandit/semgrep p/django 白盒速达。/openapi.json、/docs、/redoc 是完整攻击面地图;include_in_schema=False 的端点要靠前缀 fuzz。Depends(get_token) 只是取 token,验签和授权是自己的事;extra="allow" 是 Pydantic 的隐形批量赋值;子应用挂载可绕过全局中间件。@UseGuards 即敞开;@Public() 过宽、Reflector 键名不匹配(roles vs role)默认放行。@MessagePattern 常无守卫;ValidationPipe 可能只配 HTTP;CacheInterceptor 不带身份 key = 跨用户缓存投毒。x-middleware-subrequest、参数污染(中间件查首值、handler 用末值)是三大绕过面。__NEXT_DATA__ 过度获取、RSC flight data、ISR 缓存边界、Server Action 鉴权依赖客户端状态、Edge vs Node 运行时分叉。下一节,我们把镜头从应用框架转向第三方技术栈——Active Directory、Auth0、Firebase、Grafana/Prometheus、Supabase。这些服务的错误配置(RLS 配错、SPN 可烤、callback 过宽、observability 暴晒)是另一类「栈特有」的高危攻击面。