Claude Code 源码解析 (8):Web 抓取的 SSRF 防护设计
导读: 这是 Claude Code 20 个功能特性源码解析系列的第 8 篇,深入分析 Web 工具 (WebFetch/WebSearch) 的安全设计。
📋 目录
- [问题引入:Web 抓取的安全风险](#问题引入 web-抓取的安全风险)
- [技术原理:SSRF 防护核心架构](#技术原理 ssrf-防护核心架构)
- 设计思想:为什么这样设计
- 解决方案:完整实现详解
- OpenClaw 最佳实践
- 总结
问题引入:Web 抓取的安全风险
痛点场景
场景 1:SSRF 攻击
1 | 恶意用户:"帮我抓取这个页面的内容" |
场景 2:内网探测
1 | 恶意用户:"查看这个链接" |
场景 3:恶意内容
1 | 用户:"读取这个网页" |
核心问题
设计 AI 助手的 Web 工具时,面临以下挑战:
SSRF 防护问题
- 如何防止访问内网地址?
- 如何防止访问云元数据服务?
域名验证问题
- 如何验证 URL 合法性?
- 如何建立域名白名单?
内容安全问题
- 如何处理恶意内容?
- 如何防止 XSS 攻击?
隐私保护问题
- 如何不泄露用户凭证?
- 如何不发送敏感信息?
Claude Code 用多层防护机制解决了这些问题。
技术原理:SSRF 防护核心架构
什么是 SSRF?
SSRF (Server-Side Request Forgery) 是一种攻击方式,攻击者诱导服务器发起恶意请求。
1 | 攻击流程: |
常见攻击目标:
| 服务 | 元数据 URL | 风险 |
|---|---|---|
| AWS | 169.254.169.254 | IAM 凭证泄露 |
| GCP | metadata.google.internal | 服务账号密钥 |
| Azure | 168.63.129.16 | 订阅信息 |
| 内网 | 192.168.x.x, 10.x.x.x | 内网服务暴露 |
整体防护架构
1 | ┌─────────────────────────────────────────────────────────────┐ |
URL 验证器
1 | interface URLValidationResult { |
安全 HTTP 客户端
1 | class SecureHttpClient { |
域名白名单
1 | class DomainWhitelist { |
内容提取器
1 | class ContentExtractor { |
设计思想:为什么这样设计
思想 1:深度防御
问题: 单层防护容易被绕过。
解决: 多层防护。
1 | 第 1 层:URL 验证 → 拒绝明显恶意 URL |
设计智慧:
纵深防御让攻击者必须突破所有防线。
思想 2:默认拒绝
问题: 白名单难维护,但黑名单容易被绕过。
解决: 严格模式默认拒绝。
1 | // 宽松模式 (不推荐) |
权衡:
| 模式 | 优点 | 缺点 |
|---|---|---|
| 宽松 | 用户体验好 | 安全风险高 |
| 严格 | 安全性高 | 可能误杀 |
推荐: 严格模式 + 用户可配置白名单
思想 3:重定向保护
问题: 攻击者用重定向绕过 URL 检查。
1 | 用户请求:https://example.com |
解决: 每次重定向都验证。
1 | async handleRedirect(url: URL, response: Response): Promise<Response> { |
思想 4:DNS 重绑定防护
问题: DNS 重绑定攻击。
1 | 第一次 DNS 查询:evil.com → 8.8.8.8 (公网 IP) |
解决: 自定义 DNS 解析 + IP 验证。
1 | class SecureAgent extends Agent { |
思想 5:内容安全
问题: 网页可能包含恶意内容。
解决: 内容过滤 + 格式转换。
1 | processContent(html: string): string { |
解决方案:完整实现详解
WebFetchTool 实现
1 | export class WebFetchTool extends Tool { |
WebSearchTool 实现
1 | export class WebSearchTool extends Tool { |
安全配置
1 | # ~/.openclaw/config/web-tools.yaml |
OpenClaw 最佳实践
实践 1:安全抓取网页
1 | # 抓取网页内容 |
实践 2:网络搜索
1 | # 搜索 |
实践 3:配置白名单
1 | # ~/.openclaw/config/web-whitelist.yaml |
实践 4:错误处理
1 | # 尝试抓取内网地址 (会被阻止) |
实践 5:审计日志
1 | # 查看 Web 请求历史 |
总结
核心要点
- 深度防御 - 5 层防护机制
- 默认拒绝 - 严格模式白名单
- 重定向保护 - 每次重定向都验证
- DNS 重绑定防护 - 自定义 DNS 解析
- 内容安全 - XSS 过滤 + Markdown 转换
设计智慧
Web 工具的安全设计核心是”不信任任何输入”。
Claude Code 的 Web 工具设计告诉我们:
- SSRF 防护是 Web 工具的生命线
- 多层防御比单层更可靠
- 默认拒绝比黑名单更安全
- 内容过滤保护用户免受恶意内容
SSRF 防护检查清单
- URL 协议验证 (只允许 http/https)
- 私有 IP 地址检查
- 云元数据服务黑名单
- 重定向保护
- 自定义 DNS 解析
- 响应内容过滤
- 超时和大小限制
- 审计日志
下一步
- 启用 SSRF 防护
- 配置域名白名单
- 添加审计日志
- 定期更新黑名单
系列文章:
- [1] Bash 命令执行的安全艺术 (已发布)
- [2] 差异编辑的设计艺术 (已发布)
- [3] 文件搜索的底层原理 (已发布)
- [4] 多 Agent 协作的架构设计 (已发布)
- [5] 技能系统的设计哲学 (已发布)
- [6] MCP 协议集成的完整指南 (已发布)
- [7] 后台任务管理的完整方案 (已发布)
- [8] Web 抓取的 SSRF 防护设计 (本文)
- [9] 多层权限决策引擎设计 (待发布)
- …
上一篇: Claude Code 源码解析 (7):后台任务管理的完整方案
关于作者: John,OpenClaw 平台开发者,专注 AI 助手架构设计与实现。