Skip to content

Next.js 高级架构

Next.js 如何防御开放重定向和 SSRF?

Next.js 同时拥有浏览器跳转和服务端 fetch 能力,任何用户可控 URL 都要先明确是导航目标还是服务器请求目标。

适合阶段:安全面 / 全栈面核心能力:URL Validation · SSRF · Proxy

面试官想考什么

  • redirect(nextUrl) 有什么风险? 考察开放重定向。
  • 服务端 fetch 用户传入 URL 为什么危险? 考察 SSRF。
  • 只判断 URL 以公司域名开头够吗? 考察解析绕过。
  • 如何兼顾用户跳转和安全? 考察白名单和代理设计。

一句话回答

text
用户可控 URL 必须按用途分别校验:导航只允许站内路径或显式域名白名单,服务端 fetch 使用协议、主机、端口、DNS/IP 和响应大小限制,并通过 egress proxy 隔离内网,不能靠字符串前缀判断安全。

面试回答详解

1. 开放重定向

text
login?returnTo=/dashboard -> validate same-origin path -> redirect

拒绝 //evil.com、不同协议、编码绕过、userinfo、异常端口和不受信任域名。最安全的 returnTo 通常只接受以 / 开头且不以 // 开头的站内路径。

2. SSRF 风险

服务端 fetch 用户提供的 URL 可能访问云 metadata、内网管理面板、localhost 或代理后的服务。需要限制协议、端口、解析后的 IP、重定向次数、DNS 变化、响应大小和超时。

3. 解析策略

使用标准 URL parser,规范化后匹配 host allowlist。不能只用 startsWith("https://trusted.com"),因为 trusted.com.evil、userinfo 和重定向都可能绕过。

4. 代理与隔离

对外部图片、网页和 webhook 使用专门 egress proxy,默认拒绝私网和本地地址;下载内容再做类型、大小、扫描和存储隔离。

5. 观测

记录目标 host 的分类、拒绝原因、重定向次数和响应耗时,不记录完整敏感 URL。安全策略变更要有回滚和阻断开关。

可直接背诵的 30 秒回答

text
开放重定向和 SSRF 都源于用户控制 URL,但防护方式不同。returnTo 只允许站内路径或白名单域名,服务端 fetch 要限制协议、host、端口、解析后的 IP、重定向、超时和响应大小,并尽量经过 egress proxy。不能靠字符串前缀判断,也要做日志和攻击样本测试。

扩展知识

URL 安全检查

text
parse -> normalize -> origin/host allowlist
-> port/IP policy -> redirect policy -> timeout/size limit

面试官追问链

追问一:只允许 https 就安全了吗?

  • 考察点:协议与网络边界。
  • 回答方向:不够,HTTPS 也能访问内网;还要限制 host、解析 IP、端口、重定向和响应。

追问二:DNS 解析一次就够吗?

  • 考察点:DNS rebinding。
  • 回答方向:需要由受控代理解析和连接,或在请求前后校验,避免解析结果变化绕过策略。

追问三:为什么 new URL() 仍然需要业务校验?

  • 考察点:解析不等于授权。
  • 回答方向:解析器只提供规范化结构,是否允许访问要由业务白名单和网络策略决定。

推荐阅读

基于 MIT 协议开源