### SSRF 防御方法

1. 验证用户输入的 URL

任何由用户提供的 URL，在服务端发起请求前，都必须经过严格的验证

- 白名单验证：这是最安全的方法。只允许用户请求预先定义好的、可信的 URL 或 IP 地址。如果用户输入的 URL不在白名单中，就直接拒绝请求
- 黑名单过滤：过滤掉一些危险的 IP 地址、域名或端口。例如，过滤掉 `127.0.0.1`、`localhost`、`10.0.0.0/8`、`172.16.0.0/12`、`192.168.0.0/16` 等内网 IP 地址，以及一些高危端口如 `22`（SSH）、`3306`（MySQL）等。但是，黑名单很容易被绕过，不推荐作为唯一的防御手段

2. 禁止 URL 重定向

许多 SSRF 攻击利用了 URL 重定向。攻击者可以提供一个外部 URL，当服务器访问它时，会被重定向到内网地址

- 防御方法：在服务端代码中，禁止自动处理URL重定向。如果需要，应该手动检查重定向后的 URL 是否符合安全策略，例如是否指向了内网地址

3. 对返回内容进行处理

即使攻击者成功利用了 SSRF 漏洞，我们也可以通过限制返回内容来降低风险

- 过滤敏感信息：在将请求的返回内容展示给用户之前，过滤掉敏感信息，例如内网服务的详细报错信息、版本号等
- 统一错误页面：如果请求失败，只返回一个通用的错误页面，而不透露任何内部信息

4. 最小权限原则

运行服务的用户和网络权限应该被严格控制

- 网络权限：如果某个服务不需要访问内网资源，可以在防火墙或安全组上设置规则，禁止其访问内网 IP
- 服务权限：如果某个服务只需要访问特定的外部域名，可以配置 DNS 或主机文件，将该域名解析到特定的 IP 地址，防止解析到其他恶意 IP

5. 使用 DNS Rebinding 防御

DNS Rebinding 是一种高级的 SSRF 攻击，攻击者利用 DNS 解析的特性，让服务器第一次解析时返回一个外部 IP，第二次解析时返回一个内网 IP，从而绕过防火墙的检测

- 防御方法：在服务端发起请求时，首先将域名解析为 IP 地址，然后将该 IP 地址与白名单进行比对。在后续的请求中，都只使用这个已验证的 IP 地址，而不再次进行 DNS 解析

6. 使用专门的 URL 请求库

使用安全的 URL 请求库，这些库通常会提供更高级的 SSRF 防御功能，例如：

- 内置的 IP 地址校验：可以自动识别并阻止对私有 IP 地址的请求
- 强制使用 IP 地址：可以配置为只接受 IP 地址作为请求目标，而不是域名，从而避免 DNS Rebinding 攻击