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

怎么用DeepSeek修复PHP反序列化漏洞(附可执行代码)

雨伟姑娘_4227

雨伟姑娘_4227

发布时间:2026-10-23 09:39:53

|

662人浏览过

|

来源于php中文网

原创

用deepseek修复php反序列化漏洞,重点不是给unserialize增加一个参数,而是把不可信输入改成受约束的数据格式。下面用用户偏好设置演示json迁移、字段校验与旧数据处理。

DeepSeek官方网站首页真实截图

第一步:定位外部数据转对象的具体节点

常见入口包括Cookie、隐藏表单、缓存内容和导入文件。把读取入口、解码函数、相关类定义以及后续使用方式整理出来,说明这些内容是否可能被用户、第三方服务或低权限账号修改。

不要因为数据存在数据库里就认定可信:历史接口可能允许用户写入同一个字段。审查时沿着写入和读取两条路径追踪,并检查对象恢复后是否触发文件、网络或命令相关操作。

为什么不推荐只新增allowed_classes参数

PHP反序列化会依据数据重建值与对象,某些类在恢复或销毁过程中还可能执行魔术方法。风险取决于输入可信度、可用类以及后续行为,而不只是一个函数名。

立即学习“PHP免费学习笔记(深入)”;

PHP官方明确提醒,不应把不可信输入交给unserialize,即使设置了类限制。改用JSON可以避免按输入恢复业务类,但仍要限制长度、嵌套深度、字段集合和类型,不能把格式替换当成完整业务校验。

提交给DeepSeek的调试材料必须带上旧格式约束

  1. 从DeepSeek官网进入网页版并登录,在新会话中粘贴脱敏后的入口与解析代码。先要求判断信任边界,不提交生产Cookie、令牌、客户记录或完整配置文件。

  2. 附上两份无敏感信息的旧数据样例,解释每个字段的用途和允许值。要求DeepSeek提出JSON结构及迁移方案,明确哪些历史对象不能直接迁移。

    Deepseek Reasoner Lite Agent
    Deepseek Reasoner Lite Agent

    你是DeepSeek-R1-Agent,一个高效的内容创作者。

    下载
  3. 收到代码后检查是否仍在解析失败时回退到unserialize。若存在这种逻辑,要求移除;旧格式处理应由受控迁移任务负责,而不是在公网请求里自动尝试。

  4. 把下面五类用例交给测试环境执行,再让DeepSeek解释失败原因。模型给出的分析只用于辅助定位,最终依据是本地测试与实际业务回归。

帮我把PHP偏好设置入口从不可信序列化输入迁移为JSON。
先追踪谁能写入这些数据,再提出最小补丁。
仅允许nickname字符串、notify布尔值、theme枚举;拒绝未知字段、错误类型、超长或过深输入。
不能恢复用户指定的类,JSON失败时不能回退unserialize。
保留业务默认行为,列出旧数据离线迁移及失败隔离方案。
给完整可运行示例、正常输入和四类拒绝用例,不执行生产迁移。

完整实操示例:仅接收预先定义的指定字段

示例把顶层对象、字段名称与字段类型都列为约束。通知开关必须是真正的布尔值,字符串形式的false不能直接转换后蒙混通过;主题只能从服务端枚举中选择。

<?php
declare(strict_types=1);
// 只接收数据,不恢复任意类,不调用unserialize。
function readPreferences(string $input): array {
    if (strlen($input) > 4096) { throw new InvalidArgumentException('Too large'); }
    try { $object = json_decode($input, false, 8, JSON_THROW_ON_ERROR); }
    catch (JsonException $e) { throw new InvalidArgumentException('Invalid JSON', 0, $e); }
    if (!$object instanceof stdClass) { throw new InvalidArgumentException('Object required'); }
    $data = get_object_vars($object);
    $keys = array_keys($data); sort($keys);
    if ($keys !== ['nickname', 'notify', 'theme']) {
        throw new InvalidArgumentException('Unexpected fields');
    }
    if (!is_string($data['nickname']) || strlen($data['nickname']) < 1 ||
        strlen($data['nickname']) > 80 || !is_bool($data['notify']) ||
        !is_string($data['theme']) || !in_array($data['theme'], ['light', 'dark'], true)) {
        throw new InvalidArgumentException('Invalid preferences');
    }
    return $data;
}
$good = readPreferences('{"nickname":"小雨","notify":false,"theme":"dark"}');
if ($good['nickname'] !== '小雨' || $good['notify'] !== false) {
    throw new RuntimeException('FAIL: valid profile');
}
echo 'valid_profile: PASS', PHP_EOL;
$bad = [
    'serialized_text' => 'a:1:{s:4:"name";s:4:"demo";}',
    'extra_field' => '{"nickname":"A","notify":true,"theme":"light","role":"admin"}',
    'wrong_type' => '{"nickname":"A","notify":"false","theme":"light"}',
    'invalid_json' => '{bad',
];
foreach ($bad as $name => $input) {
    try { readPreferences($input); }
    catch (InvalidArgumentException $e) { echo $name, ': PASS rejected', PHP_EOL; continue; }
    throw new RuntimeException('FAIL: ' . $name);
}
echo 'Runtime: PHP ', PHP_VERSION, ' / ', PHP_SAPI, PHP_EOL;

把这段代码存成audit.php,在开启JSON扩展的PHP环境下运行就行。这个脚本只会解析预设的演示字符串,不会实例化任何业务对象,不会发起网络请求,也不会改动数据库内容。

php audit.php

本次在macOS上的PHP 8.5.10 WebAssembly运行时执行,得到一条正常通过与四条拒绝通过。没有调用DeepSeek模型,没有执行对象利用链;结果只覆盖这里定义的解析器与字段规则。

JSON偏好设置解析器五条回归测试的实际输出

新接口开发和旧数据迁移要分开排期落地

场景 处理方案 注意点
新公开接口 只收JSON并严格校验 拒绝旧序列化格式,不静默兼容
历史存量记录 隔离环境分批迁移后重新校验 先确认来源与完整性,无法确认的记录隔离处理

确实必须保留服务端序列化缓存时,限制写入者并验证完整性,结合最小权限与依赖更新评估风险。签名不能让已经包含危险对象的数据自动安全,更不能为客户端可控制的对象恢复流程背书。

迁移操作必须先拿小批量脱敏副本做试跑,统计好成功、失败、无法识别三类数据的具体数量。新旧读取逻辑的切换要定死明确的截止时间,所有失败数据统一进隔离队列处理,绝对不能为了强行兼容旧数据,又把风险入口重新放开。

四个最容易被遗漏的校验节点

  • 解析失败后仍尝试旧格式:删除公网回退逻辑,并给客户端返回明确的格式错误。
  • JSON合法但可写入管理员字段:检查字段白名单,不把解析结果整体用于更新用户对象。
  • 通知开关行为不对:核对布尔类型,别直接强制转换字符串。
  • 迁移后缓存频繁报错:逐一确认写入端已经切换,必要时安全失效旧缓存,不混用两种编码。

热门AI工具

更多
DeepSeek

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

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

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

豆包大模型

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Laper
Laper Hot

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

Atoms
Atoms Hot

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

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

11264

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

6541

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2155

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

4128

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4854

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3811

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5477

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4282

2023.11.13

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

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

0

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

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

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