PHP文件上传:基于mime或扩展的验证?

Sha*_*iul 12 php file-upload

当我尝试处理文件上传时,是否应该根据文件MIME类型或文件扩展名运行验证?

这两种文件验证方式的优缺点是什么?

而且,我应该关注任何其他安全问题吗?

在这些日子里,我依赖于MIME类型,但在这篇文章中回答最多的投票

PHP中的文件上传问题说:

永远不要依赖浏览器提交的MIME类型!

cyp*_*her 30

好的,所以对于这里所有关于"SCREW EXTENSIONS,CHECK MIME!FILEINFO RLZ!"的人来说,我已经准备了一些教程:

  1. 下载我画的这个漂亮的php徽标
  2. 查看它.很好,不是吗?
  3. 将其重命名为whatever_you_like.php
  4. 把它穿过你所有令人敬畏的哑剧类型/任何跳棋
  5. 运行

总之,你永远也不会EVER依靠MIME类型.你的网络服务器并不关心MIME类型,它决定了EXTENSION要做什么,最终是@vol.Shrapnel的回答其实是对的.通过检查MIME提供给您的任何信息在执行时都与您的网络服务器完全无关.

编辑:不那么罕见的代码,因为它想要它会为这种类型的攻击打开一个网站:

<?php

$mimetype = mime_content_type($_FILES['file']['tmp_name']);
if(in_array($mimetype, array('image/jpeg', 'image/gif', 'image/png'))) {
   move_uploaded_file($_FILES['file']['tmp_name'], '/whatever/something/imagedir/' . $_FILES['file']['name']);
   echo 'OK';

} else {
    echo 'Upload a real image, jerk!';
}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,我为这种傲慢的语气道歉,但这样的答案严重阻碍了我. (9认同)
  • 首先,没有必要如此公然地不尊重.曾经听说过ad hominem吗?如果你是对的,那么你的答案应该独立而不是侮辱.其次,如果您只是将上传的文件转储到服务器上的公共文件夹中,那么扩展检查是有意义的 - 为什么要将php文件作为图像?但是,如果你正在使用GD或其他一些图像函数来处理上传的图像,MIME类型,更重要的是,由于非图像文件会破坏你的代码,上传的文件将不会被保存.检查*both*是最安全的路线. (2认同)