在 Agent 执行前落实外部链接范围限制

一个网页总结 Agent 只需要读取文档站,工具却接受任意 URL,这会把一次阅读任务变成服务器代发请求。模型输出的链接、页面里的跳转以及 DNS 解析结果都可能改变最终连接目标。限制链接范围时,要检查真正准备建立的连接。
本文用 docs.example.com 这样的保留示例域名描述规则,不提供探测目标。假定应用只需要 HTTPS 文档读取。OWASP SSRF 防护清单建议在可确定目标的场景使用允许列表,并注意重定向、DNS 和连接时机带来的变化。
先缩小 URL 合同
from urllib.parse import urlsplit
def allowed_url(text):
p = urlsplit(text)
return (p.scheme == "https"
and p.hostname == "docs.example.com"
and p.port in (None, 443)
and p.username is None
and p.password is None)
这只是语法与主机层的演示,生产代码还应拒绝原始 URL 的控制字符并捕获解析异常。Python 的 URL 解析说明指出,解析函数并不代替完整验证。不要用 "example.com" in url 这样的子串判断,也不要用未经边界约束的后缀判断。规范化策略要由同一个 URL 解析库承担,避免验证器和 HTTP 客户端理解不同。

域名通过以后还有两层
域名允许不意味着任意解析地址都可连接。解析所得地址应按应用出站政策校验,拒绝不允许的本地、私网和其他受限地址。连接过程也要防止校验后重新解析到另一目标。可以由受控出站代理完成解析与连接检查,减少不同客户端各自实现带来的差异。
默认关闭自动重定向最容易解释。如果业务必须跟随跳转,每一跳都重新解析 URL、校验主机及端口、校验解析地址,并共用总跳转数和总耗时限制。页面上“这是官方链接”的文字没有授权能力,模型也不能以完成任务为由临时扩大域名范围。
展示链接与获取链接分开
回答里显示一个链接,不等于服务器已经访问它。工具接口最好把 show_reference 与 fetch_document 分开:前者只作为文本展示,后者走网络范围检查。展示时仍需安全的链接处理与来源提示,不能把未经确认的地址伪装成可信来源。
验证用例可以覆盖允许主机、相似主机、非 HTTPS、显式非标准端口、解析失败、禁止地址及跳转出域。用模拟解析器和本地替身客户端验证,不向未知站点发起请求。日志记录规范主机、跳数、判定和原因码,查询参数中的令牌应删去。范围检查限制的是网络可达性;允许文档仍可能包含错误内容或提示注入,检索结果进入模型后仍要当作不可信材料。
如果文档抓取包含图片预览、附件下载或页面脚本,这些附带请求也要经过同样的出站边界。为了范围清楚,纯正文工具可以不执行脚本、不自动抓取页面资源;业务确需资源时,把请求计入同一任务预算并逐项核对目标。不能认为主页面允许就意味着所有附属资源都允许。
方法与凭据也属于合同。只读抓取不应允许模型选择任意请求方法,也不应把应用管理令牌附加到任意 URL。允许主机需要认证时,由服务端选择最小凭据,且禁止不必要的跨目标转送。网络可达性之外,具体文档仍由服务端按当前身份做访问检查。
更多推荐



所有评论(0)