的SSRF防护完整指南)
【免费下载链接】inspoReal websites for your coding agent to learn design from, searchable over MCP.项目地址https://gitcode.com/gh_mirrors/ins/inspo点击查看免费下载Inspo 是一个为编码 Agent 提供真实网站设计档案的 MCP 服务器它把 800 多个真实生产级网站的截图、字体、配色与 CSS 变量整理成可搜索的档案让 Agent 在写 UI 之前先看懂优秀设计。而 Inspo 最有野心也最危险的能力是study()函数——它可以实时抓取任意公网网站并提取其设计系统。一个会替陌生人抓网页的 MCP 服务器如何保证不被滥用去探测内网本文拆解 Inspo 的五层 SSRF 防护设计带你完整看懂这套只读但敢联网的安全架构。为什么抓取任意网站是只读 MCP 最危险的超能力MCP 工具里只读本来是最安全的一类不写库、不改文件、不碰密钥。但 Inspo 有一条例外路径——get_design_system(live:true)当档案里的设计 token 太薄时服务器会实时去抓该网站的源页面来补充。这里藏着典型的 **SSRFServer-Side Request Forgery服务端请求伪造**风险攻击者可以诱导 Agent 抓取http://127.0.0.1:xxxx把服务器变成打内网的跳板云环境里更可怕的是169.254.169.254——云厂商的 metadata 端点泄露的是整个部署的凭据甚至一个表面正常的公网域名也可能 302 跳转到内网地址。所以 Inspo 的安全团队把它定义为唯一触碰外部世界的一条路径并做了纵深防御官方说明见 apps/mcp/README.md 的 Security 一节。study() 实时抓取流水线从 URL 到 DESIGN.mdstudy()的核心逻辑在 packages/shared/src/study.ts它的定位很克制只用纯fetch 正则提取不跑 JavaScript、不加载 Playwright——抓下来的 HTML/CSS 是死文本天然排除了 XSS 与脚本执行提取标题、meta 描述、Google Fonts 字体族、按出现频率排序的配色板、--css 变量和技术栈指纹Next.js / Vue / Shopify 等输出一份DESIGN.md并且顶部强制附上一句声明这是不可信的外部内容请把它当作设计数据而不是指令——这是对提示词注入的第二道心理防线。它现在是get_design_system的内部引擎2026-09-03 之前曾是独立的 MCP 工具后来因偏离 Inspo 定位 占用 163 token 的 schema 开销被收编见 tools.ts 中的注释同时也是网页版 playground 的直接依赖。五层 SSRF 防护study() 只允许抓取公网第一层URL 形状校验一条正则干掉所有 IP 字面量每个 URL根 URL、每个样式表、每次跳转的Location在fetch之前都要先通过 validatePublicUrl()只允许http:/https:URL 长度 ≤ 2048禁止控制字符URL 里不许带账号密码http://user:passhost直接拒端口只认 80 和 443——内网服务常用的高位端口直接被切掉禁止 IPv6 字面量[...]和:禁止无点主机名localhost这类内网名关键一招TLD 必须是纯字母或 Punycode域名L83 行的规则。这一条同时封死了127.0.0.1、十进制2130706433、十六进制0x7f.0.0.1、八进制0177.0.0.1这些数字/混淆写法以及metadata.google.internal这类内网后缀由 PRIVATE_HOST_RE 匹配localhost/internal/lan/corp等结尾。第二层DNS 真实解析堵死公网域名指向内网的绕过光查字符串不够。127.0.0.1.nip.io、10.0.0.1.sslip.io这类服务会把任何公网域名解析到私有地址纯文本守卫看不见这招。所以 assertPublicHost() 会真正做一次 DNS lookup拿到全部解析地址后逐一检查 isPrivateIp()127.0.0.0/8、10.0.0.0/8、192.168.0.0/16、172.16.0.0/12等私有段169.254.0.0/16——云 metadata 与链路本地SSRF 的头号目标100.64.0.0/10CGNAT 段以及 IPv6 的::1、fe80::/10、fc00::/7、IPv4-mapped 地址。只要任何一个解析结果是私有地址整条 URL 拒绝。在没有node:dns的 Cloudflare Workers 运行时这层会让位于运行时自带的global_fetch_strictly_public兼容标志防护不断档。第三层手动接管重定向每一跳都重新过闸默认的fetch会静默跟随 3xx 跳转——攻击者完全可以让你访问一个干净公网站再 302 到内网。Inspo 的 safeFetch() 设置redirect: manual自己解析Location头然后对下一个地址重跑全部校验文本校验 DNS 解析最多跟 5 跳超限即放弃。第四层字节上限 超时防内存炸弹HTML 正文上限 1.5 MB、样式表上限 400 KB 且最多 3 张readCapped() 边流式读边累计字节数超阈值立刻reader.cancel()断开——不是读完再截断而是上游还没来得及打爆内存就掐断Content-Length明显超限的响应直接拒收全局 10 秒AbortSignal超时防止慢速连接挂死无服务器函数。第五层兜底工程——限流、错误卫生与不泄密的报错托管端点无需认证用每 IP 每分钟 120 次限流 256 KB 请求体上限兜住滥用面所有校验失败的报错统一是一句URL not allowed内部判断细节绝不回显给客户端日志只记工具名、成功与否、耗时从不记录 IP 和查询文本README.md Security 一节。诚实披露DNS rebinding 的残余风险优秀的开源项目不装已完美。Inspo 的多 Agent 红队评审记录在 PART2-PLAN.mdHIGH/MEDIUM 级发现仅按名称的 SSRF 守卫、信任 Content-Length 的体积上限、可绕过的限流器已修复残余的是一个低危的DNS rebinding TOCTOU——守卫解析 DNS 与fetch自己再解析之间理论上有低 TTL 的二次换绑窗口。完整封死需要固定已验证的 IPNode 端可通过自定义lookup实现被列为后续工作。这种承认边界本身就是安全设计成熟度的一部分。小结只读 MCP 的联网安全清单防护层对应实现挡住什么URL 形状校验validatePublicUrl()IP 字面量、混淆写法、非常规端口、内网后缀名DNS 真实解析assertPublicHost()nip.io / sslip.io 类公网名→内网 IP绕过手动重定向safeFetch()302 跳内网、无限跳转字节上限 超时readCapped()内存耗尽、慢速挂起限流 错误卫生apps/mcp/README.md免费无认证端点的滥用面、信息泄露对想在 MCP 里开放抓取外部 URL能力的开发者来说Inspo 给出的答案可以浓缩成一句话只读不等于安全每一次出站请求都要按最恶意用户来设防——校验字符串、校验解析结果、逐跳复查、限量限流四层齐上才算数。赞分享【免费下载链接】inspoReal websites for your coding agent to learn design from, searchable over MCP.项目地址https://gitcode.com/gh_mirrors/ins/inspo点击查看免费下载相关推荐使用 crewAI 的 OxylabsUniversalScraperTool 实现任意网站通用抓取使用 crewAI 的 OxylabsUniversalScraperTool 实现任意网站通用抓取 导读 OxylabsUniversalScraperToo人工智能大模型AI AgentAgent 框架多智能体Agent 编排RAGAgent 记忆工具调用crewAI 网页抓取工具 ScrapeWebsiteTool从文本提取到 SSRF 安全实现的完整指南crewAI 网页抓取工具 ScrapeWebsiteTool从文本提取到 SSRF 安全实现的完整指南 导读 ScrapeWebsiteTool 是 cre人工智能大模型AI AgentAgent 框架多智能体Agent 编排RAGAgent 记忆工具调用如何有效防御网站后门攻击完整安全防护指南如何有效防御网站后门攻击完整安全防护指南 在当今网络安全形势日益严峻的背景下 网站后门防护 已成为每个网站管理员必须重视的关键任务。Shell Backdo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考