php上传文件名截断,PHP上传带有单引号文件名的文件导致文件名被截断的bug

"本文揭示了一个PHP版本低于5.3且魔法引用开启时的文件上传漏洞,当上传'lalalala'gagaga.txt'这样的文件时,文件名会被截断。作者提供了关闭魔法引用、升级PHP版本、使用JavaScript隐藏域存储文件名等解决方案,并指出此问题早在2005年就被发现但未修复。"
摘要由CSDN通过智能技术生成

新发现一个PHP的文件上传bug,bug描述如下:

触发条件:

PHP版本 < 5.3

PHP魔法引用开启

如果你上传一个叫做lalalala'gagaga.txt的文件,那么在服务器端接收到的时候,文件名就会从引号处被截断,名字变成gagaga.txt

$_FILES数组测试参数如下图:

fd17b7f940aaf2c222794dcd77d3c529.png

bug分析:

导致这个问题的原因是由于魔法引用功能转义单引号触发,

如果默认路径是c:\tmp\lalalala'gagaga.txt

那么经过魔法引用后就变成了c:\\tmp\\lalalala\'gagaga.txt

如果你使用basename函数打印这个字符串,就会得到'gagaga.txt

解决方案:

1.关闭你PHP的魔法引用功能

2.升级你的PHP到5.3版本,在5.3中这个问题已经修复

3.如果上面两个方案你都无法办到,那么下面是兼容方案

在你上传的表单里面增加一个隐藏域用于存储文件名称,选择文件后使用JavaScript取得文件名并将其存储在隐藏域中

例如:

然后在服务器端做相关处理

aeb61d0aa2ce5e5eed9dece768ea8891.png

这个问题在05年就有人发现了,不知道为啥PHP开发组一直没有修复这个bug

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值