You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP7及更早版本中php://filter与data://的base64编码数据丢失问题

该差异属于PHP7及更早版本的BUG

现象说明

在PHP7及更早版本中,使用php://filter的convert.base64-encode过滤器处理data://流时,会出现数据处理异常:无论输入的data://流内容长度是否为3的倍数,最终输出的Base64编码结果完全一致;而在PHP8中,不同长度的输入会生成对应的正确编码结果。

测试代码1

<?php

$data1 = file_get_contents("php://filter/convert.base64-encode/resource=data://text/plain,111111111");
$data2 = file_get_contents("php://filter/convert.base64-encode/resource=data://text/plain,11111111111");

echo $data1."\n";
echo $data2."\n";

echo ($data1 === $data2) ? "Same output" : "Different output";
  • PHP7及更早版本输出:Same output
  • PHP8输出:Different output

测试代码2

<?php
$data1 = file_get_contents("php://filter/convert.base64-encode/resource=data://text/plain,111111111");
$data2 = file_get_contents("php://filter/convert.base64-encode/resource=data://text/plain,1111111111");
$data3 = file_get_contents("php://filter/convert.base64-encode/resource=data://text/plain,11111111111");
echo $data1."\n";
echo $data2."\n";
echo $data3."\n";

PHP7输出结果:

MTExMTExMTEx
MTExMTExMTEx
MTExMTExMTEx

问题根源

这个异常是PHP7及更早版本中php://filter过滤器与data://流交互时的逻辑缺陷导致的:当输入内容长度为3的倍数时,过滤器的缓冲区处理机制出现错误,后续不同长度的输入被错误复用了之前的编码结果,而非重新计算对应内容的Base64编码。

修复状态

PHP8版本已经修复了该流处理逻辑的问题,php://filter与data://流结合使用时,能正确根据输入内容生成对应的Base64编码结果。

内容的提问来源于stack exchange,提问作者n0o0b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:13:14