新发现一个PHP的文件上传bug,bug描述如下:
触发条件:
PHP版本 < 5.3
PHP魔法引用开启
如果你上传一个叫做lalalala'gagaga.txt的文件,那么在服务器端接收到的时候,文件名就会从引号处被截断,名字变成gagaga.txt
$_FILES数组测试参数如下图:
bug分析:
导致这个问题的原因是由于魔法引用功能转义单引号触发,
如果默认路径是c:\tmp\lalalala'gagaga.txt
那么经过魔法引用后就变成了c:\\tmp\\lalalala\'gagaga.txt
如果你使用basename函数打印这个字符串,就会得到'gagaga.txt
解决方案:
1.关闭你PHP的魔法引用功能
2.升级你的PHP到5.3版本,在5.3中这个问题已经修复
3.如果上面两个方案你都无法办到,那么下面是兼容方案
在你上传的表单里面增加一个隐藏域用于存储文件名称,选择文件后使用JavaScript取得文件名并将其存储在隐藏域中
例如:
然后在服务器端做相关处理
这个问题在05年就有人发现了,不知道为啥PHP开发组一直没有修复这个bug