ssrf防护核心是禁用用户可控url直连,须白名单校验ip协议、禁用file/gopher等危险协议、禁用重定向、限制超时,并在部署层拦截内网请求。

写 PHP 代码防范 SSRF(Server-Side Request Forgery),核心是**不直接使用用户可控的 URL 发起后端网络请求**,并对所有外发请求做严格校验和限制。
禁止直接拼接用户输入发起请求
很多 SSRF 漏洞源于直接用 $_GET['url']、$_POST['target'] 等参数调用 file_get_contents()、cURL 或 Guzzle。哪怕加了简单过滤(比如只允许 http://),也极易被绕过(如 http://127.0.0.1@evil.com)。
- 把用户输入的“目标地址”改为预定义的 ID 或别名(如 service=payment-api),再在服务端映射到白名单内的真实地址
- 完全避免将原始 URL 作为参数接收;如必须支持自定义源,改用前端上传文件、后端仅处理本地临时路径
强制校验请求目标的 IP 和协议
如果业务确实需要动态请求外部地址(如 Webhook 回调、内容抓取),必须在发起前解析并验证目标主机的真实 IP:
- 用 gethostbyname() 或 dns_get_record() 解析域名,再用 filter_var($ip, FILTER_VALIDATE_IP) 判断是否为私有地址(127.0.0.0/8、10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、::1、fd00::/8 等)
- 拒绝所有解析后落在内网网段的 IP;注意处理 IPv6、短地址(0x7f000001)、127.1 等绕过形式
- 协议只允许 https?,禁用 file://、gopher://、dict://、ftp:// 等高危协议
使用带限制的 HTTP 客户端并配置超时与重定向
原生 cURL 或 file_get_contents 缺少默认防护,建议封装或使用现代客户端(如 Guzzle 7+),并显式约束行为:
- 设置 max_redirects = 0 或极小值(如 2),防止跳转到内网地址
- 启用 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false),禁用自动重定向
- 设 timeout 和 connect_timeout(如各 5 秒),避免因 DNS 慢或内网探测导致阻塞
- Guzzle 中可配合 allow_redirects => ['max' => 0] 和 verify => true(强制 HTTPS 证书校验)
部署层补充防护更可靠
代码层防御可能遗漏边界情况,建议在服务器或网络层面加固:
- Web 服务(如 Nginx)配置 deny 127.0.0.1;、deny 10.0.0.0/8; 等规则,拦截对内网地址的出站请求(需配合 iptables 或 eBPF)
- 容器环境限制 outbound 网络策略,只放行必要域名或公网 CIDR
- 关键服务(如 Redis、Elasticsearch)绑定到 127.0.0.1 而非 0.0.0.0,减少暴露面
SSRF 不是靠“过滤关键词”能解决的问题,重点在于控制数据流向、缩小攻击面、分层设防。从设计阶段就避免让用户决定请求目标,是最有效的预防方式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











