标准答案
- SSRF 需要限制协议、解析后的 IP、内网和云元数据地址,并处理重定向和 DNS 变化。
- 命令执行优先使用参数数组和固定可执行文件,禁止把用户输入拼进 shell。
- 文件路径使用目录约束、规范化和权限控制,防止路径穿越和符号链接绕过。
- 所有外部输入还要设置大小、超时、资源和审计边界。
题目解析
SSRF 防护要围绕“最终连接到哪里”设计:限制协议和端口,解析后拒绝 loopback、link-local、私网和云元数据地址,处理重定向,并防止 DNS 解析结果在检查后发生变化。单纯拒绝字符串 localhost 不足以覆盖 IP、IPv6、编码和解析差异。
命令执行优先使用固定可执行文件和参数数组,并使用 shell=False;如果业务确实需要 shell 语法,应改为受限 DSL 或严格的允许列表,而不是转义一段用户输入。文件操作要对规范化路径做目录约束,并考虑符号链接、归档解压和文件大小上限。
这些检查应发生在实际发起请求、执行命令和打开文件的边界,且运行账户要有最小权限。安全测试应覆盖重定向、DNS 变化、IPv6、路径穿越、符号链接和资源耗尽,而不是只测一个正常输入。
常见误区
- 误区:只禁止 URL 中出现 localhost。改正:对解析后的 IPv4/IPv6 地址、重定向目标、端口和 DNS 变化做策略检查。
- 误区:用 shell=True 拼接用户输入后再做黑名单过滤。改正:使用固定程序和参数数组,必要时建立明确的允许列表和沙箱。
- 误区:只检查文件扩展名。改正:限制规范化路径、真实文件类型、大小和解压层级,并处理符号链接。