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
相关产品推荐
相关产品推荐

