TP框架SSRF漏洞分析及修复方案

老明姑娘_5760

老明姑娘_5760

2026-08-20

658人浏览

原创

ThinkPHP框架本身不直接引入SSRF漏洞,但开发者若用用户可控参数构造HTTP请求且未严格校验URL,易触发SSRF;常见场景包括图片加载、远程资源抓取等,需重点排查用户输入直传、协议不限、内网IP未拦截等问题。

tp框架ssrf漏洞分析及修复方案

ThinkPHP(TP)框架本身不直接引入 SSRF 漏洞,但当开发者在业务逻辑中使用用户可控参数构造 HTTP 请求(如 file_get_contents、curl_exec、Requests::get 等),且未对传入的 URL 做严格校验时,就可能触发 SSRF。TP 的常见 SSRF 场景集中在图片加载、远程资源抓取、URL 重定向、第三方 API 调用等模块。

TP 中典型的 SSRF 触发点

以下几类代码模式在 TP 项目中高频出现,需重点排查:

  • 用户输入直传请求函数:例如控制器中接收 $_GET['url'] 或 $this->request->param('url') 后,直接用于 curl_init($url) 或 file_get_contents($url)
  • URL 解析未限制协议与地址:未禁用 file://、gopher://、dict:// 等危险协议;未阻止解析出内网 IP(如 127.0.0.1、192.168.x.x、10.x.x.x、172.16.x.x–172.31.x.x)
  • 域名解析绕过白名单:仅校验原始域名(如 example.com),但未做 DNS 解析后的真实 IP 校验,攻击者可通过 DNS 重绑定(DNS rebinding)绕过
  • TP 自带组件风险调用:部分老版本 TP 使用 think\facade\Cache 或 think\facade\Log 时若配合自定义驱动或远程存储配置不当,也可能间接引发 SSRF(较罕见,但不可忽视)

TP 环境下的 SSRF 修复建议

修复应遵循“输入即不可信、请求即需约束”原则,不依赖前端或中间件过滤,所有校验必须落在服务端逻辑层。推荐分层防御:

网易外贸通
网易外贸通

一款AI工具,主要用于网易旗下专为外贸企业打造的一站式海外营销管理平台,适合需要提升相关任务效率的用户。

下载
  • 强制白名单机制:只允许访问预设可信域名或 IP(如 oss.aliyuncs.com、api.weixin.qq.com)。使用正则或数组 in_array 判断,避免模糊匹配(如 aliyuncs.com 匹配到 evil-aliyuncs.com)
  • 协议与格式双重校验:用 parse_url() 解析用户输入,检查 scheme 是否仅为 http 或 https;拒绝空 scheme、相对路径、含 @ 的 URL(如 http://attacker@127.0.0.1)
  • 真实 IP 黑名单拦截:对域名做 gethostbyname() 或 dns_get_record() 解析,获取 A/AAAA 记录 IP,再判断是否属于 RFC1918 内网段或本地回环。注意处理 CNAME 链和 IPv6 场景
  • 请求上下文隔离:关键下载/代理功能改由独立代理服务(如 Nginx 反向代理 + allow/deny 规则)或云函数承担,主应用不再发起外网请求

TP 代码修复示例(v6.x 推荐写法)

以下为控制器中安全获取远程图片的参考实现:

// ✅ 安全做法:白名单 + 协议校验 + IP 解析 + 超时控制
use think\facade\Log;
use GuzzleHttp\Client;

public function fetchImage()
{
    $url = $this->request->param('url', '');
    
    // 1. 基础格式校验
    if (!filter_var($url, FILTER_VALIDATE_URL)) {
        return json(['code' => 400, 'msg' => '非法URL格式']);
    }
    
    $parsed = parse_url($url);
    if (!in_array(strtolower($parsed['scheme']), ['http', 'https'])) {
        return json(['code' => 400, 'msg' => '仅支持 http/https 协议']);
    }
    
    // 2. 白名单域名比对(精确匹配)
    $whitelist = ['img.example.com', 'cdn.example.org'];
    $host = strtolower($parsed['host'] ?? '');
    if (!in_array($host, $whitelist)) {
        return json(['code' => 403, 'msg' => '域名不在白名单']);
    }
    
    // 3. 解析并校验真实IP(防DNS重绑定)
    $ip = gethostbyname($host);
    if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) {
        return json(['code' => 403, 'msg' => '目标IP为内网或保留地址']);
    }
    
    // 4. 发起受控请求
    try {
        $client = new Client(['timeout' => 5]);
        $res = $client->get($url);
        return $res->getBody();
    } catch (\Exception $e) {
        Log::error('SSRF fetch failed: ' . $e->getMessage());
        return json(['code' => 500, 'msg' => '请求失败']);
    }
}

补充注意事项

除代码修复外,还需关注部署与运维层面:

  • 禁用 PHP 危险函数(如 allow_url_fopen=Off,disable_functions=file_get_contents, curl_exec, fsockopen),但注意不影响 TP 正常运行
  • Web 服务器(Nginx/Apache)配置中限制 outbound 连接,例如通过 iptables 或 eBPF 限制 PHP-FPM 进程仅能访问指定出口 IP 和端口
  • 定期扫描项目中所有 curl_*、file_get_contents、stream_context_create、Requests::* 等调用点,建立请求白名单台账
  • TP 升级至最新稳定版(v6.3+),关注官方安全公告,避免已知组件级 SSRF 风险(如旧版 think-captcha 在特定配置下可能触发)

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

2026.11.02

0

14

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

2026.11.02

0

17

Uvicorn安装配置教程
Uvicorn安装配置教程

本专题汇总了Uvicorn的安装配置教程与部署指南,涵盖通过pip安装Uvicorn、启动FastAPI/Starlette应用、开发模式热重载(--reload)及多进程工作模式配置等核心操作。同时整理了结合Gunicorn的生产部署方案、HTTPS与反向代理配置及性能调优技巧,助你快速完成Uvicorn服务的安装与上线部署。

2026.11.02

0

17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

100

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

80

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

240

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

140

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

140

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

100

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习