讲师中心 微信公众号
AI工具推荐 视频效率加速

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

老明姑娘_5760

老明姑娘_5760

发布时间:2026-08-20 14:17:24

|

658人浏览过

|

来源于php中文网

原创

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 修复建议

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

  • 强制白名单机制:只允许访问预设可信域名或 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 在特定配置下可能触发)

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

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

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

0

2026.11.02

Uvicorn使用教程
Uvicorn使用教程

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

0

2026.11.02

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

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

0

2026.11.02

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

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

120

2026.10.28

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

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

80

2026.10.28

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

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

280

2026.10.28

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

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

160

2026.10.22

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

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

140

2026.10.22

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

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

100

2026.10.22

热门下载

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

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn