php ssrf修复核心是禁止服务端发起不受控网络请求,须严格白名单协议(仅http/https)、校验目标ip与域名双重合法性、禁用跳转、统一安全客户端管控所有外发请求。

PHP SSRF漏洞修复的核心是:**不让服务端替攻击者发起不受控的网络请求**。关键不在“堵住所有坏输入”,而在于建立明确、可验证的信任边界——只允许访问已知安全的目标。
协议与URL结构必须严格白名单
不能靠黑名单过滤(比如禁止file://或gopher://),因为新协议、编码绕过、协议拼接层出不穷。应只允许http和https,并禁用所有其他协议:
- 使用parse_url()解析用户传入的URL,检查scheme字段是否为http或https,其余一律拒绝
- 禁用cURL的协议切换能力:curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
- 对file_get_contents()等函数,不要直接传用户URL;统一走封装后的安全请求函数
目标地址要做IP与域名双重校验
仅校验域名不顶用——攻击者可用127.0.0.1、0.0.0.0、进制IP、DNS重绑定等方式绕过。必须解析出真实IP并判断是否在允许范围内:
- 调用gethostbyname()或dns_get_record()获取A/AAAA记录
- 用ip2long()或filter_var($ip, FILTER_VALIDATE_IP)校验IP格式
- 用ip_in_range()或inet_pton()比对是否属于内网段(如10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、127.0.0.1)或云元数据地址(如169.254.169.254)
- 若目标是域名,需限制其解析结果只能指向公网IP,且不能含私有IP别名
禁用跳转与响应内容可信处理
302跳转是SSRF绕过的高频手法,攻击者先让服务端请求一个可控地址,再302跳到内网目标。必须主动切断这一链路:
- cURL中设置:curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
- 禁用CURLOPT_UNRESTRICTED_AUTH,防止跳转后携带原始认证头
- 对返回内容做最小化处理:只提取所需字段(如网页标题),不原样输出响应体;敏感操作(如写文件、执行命令)绝不基于SSRF响应触发
从源头收口:统一请求客户端 + 输入隔离
零散调用curl_init()、file_get_contents()极易遗漏防护。推荐构建一个“安全HTTP客户端”类:
- 所有外部请求必须经由此类发起,强制执行协议检查、域名/IP校验、跳转禁用
- 业务层不再接收原始URL参数,而是接收预定义的资源标识(如provider=github、id=123),由客户端内部映射到可信地址
- 对富文本、Webhook、截图、预览等高危功能,额外增加管理员确认或二次授权机制
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











