Tom*_*Tom 6 php upload file-upload uploading
我正在创建文件上传脚本,我正在寻找验证上传文件的最佳技术和实践.
允许的扩展名为:
$allowed_extensions = array('gif','jpg','png','swf','doc','docx','pdf','zip','rar','rtf','psd');
Run Code Online (Sandbox Code Playgroud)
这是我正在做的清单.
检查文件扩展名
$path_info = pathinfo($filename);
if( !in_array($path_info['extension'], $allowed_extensions) ) {
die('File #'.$i.': Incorrent file extension.');
}
Run Code Online (Sandbox Code Playgroud)检查文件mime类型
$allowed_mimes = array('image/jpeg','image/png','image/gif','text/richtext','multipart/x-zip','application/x-shockwave-flash','application/msword','application/pdf','application/x-rar-compressed','image/vnd.adobe.photoshop');
if( !in_array(finfo_file($finfo, $file), $allowed_mimes) ) {
die('File #'.$i.': Incorrent mime type.');
}
Run Code Online (Sandbox Code Playgroud)检查文件大小.
我该怎么做才能确保上传的文件是有效的文件?我注意到奇怪的事情.我将.jpg文件扩展名更改为.zip并且...已上传.我认为它的MIME类型不正确但之后我注意到我没有检查特定的类型,但是如果数组中存在特定的MIME类型.我稍后会修复它,这对我来说没有问题(当然,如果你有任何好的解决方案/想法,请不要犹豫,分享它,请).
我知道如何处理图像(尝试调整大小,旋转,裁剪等),但不知道如何验证其他扩展.
现在是我的问题的时候了.
我试图上传它显示给我的.psd文件(image/vnd.adobe.photoshop).我对此有点困惑.文件是否始终具有相同的MIME类型?
另外,我不能强制代码块工作.有没有人猜到为什么?
如果您想验证图像,最好使用 getimagesize(),并查看它是否返回一组有效的尺寸,或者如果它是无效的图像文件,则会出错。或者对您想要支持的任何文件使用类似的函数。
关键是文件名完全没有任何意义。文件扩展名(.jpg 等)、mime 类型……都是针对人类的。
保证文件类型正确的唯一方法是打开它并逐字节评估它。显然,如果您想尝试验证大量文件类型,这是一项相当艰巨的任务。在最简单的层面上,您将查看文件的前几个字节,以确保它们与该类型文件的预期匹配。
许多文件格式都有一组非常标准的起始字节来指示格式。如果您对前几个字节进行二进制读取并针对已知格式的起始字节对其进行测试,那么它应该是一种相当可靠的方法来确认文件类型与扩展名匹配。
比如JPEG的起始字节是0xFF、0xD8;所以像:
$fp = fopen("filename.jpg", "rb");
$startbytes = fread($fp, 8);
$chunked = str_split($startbytes,1);
if ($chunked[0] == 0xFF && $chunked[1] == 0xD8){
$exts[] = "jpg";
$exts[] = "jpeg";
}
Run Code Online (Sandbox Code Playgroud)
然后检查exts。
可以工作。
| 归档时间: |
|
| 查看次数: |
6503 次 |
| 最近记录: |