PHP识别文件伪装(文件上传)

问题:文件上传时候需要验证上传的文件是否合法,文件伪装如何识别?

一个简单测试:把txt文件后缀直接改成jpg;上传

  1. <!DOCTYPE html>
  2. <html>
  3. <title>test</title>
  4. <body>
  5. <form enctype="multipart/form-data" action="test.php" method="POST">
  6. <!-- MAX_FILE_SIZE must precede the file input field -->
  7. <input type="hidden" name="MAX_FILE_SIZE" value="102400" />
  8. <!-- Name of input element determines name in $_FILES array -->
  9. Send this file: <input name="userfile" type="file" />
  10. <input type="submit" value="Send File" />
  11. </form>
  12. </body>
  13. </html>

1.通过$_FILES['userfile']['type'];获取文件后缀名;

  1. $data = $_FILES['userfile'];
  2. var_dump($data);
  3. /**结果**/
  4. /*
  5. array(5) {
  6. ["name"]=>
  7. string(8) "test.jpg"
  8. ["type"]=>
  9. string(10) "image/jpeg"
  10. ["tmp_name"]=>
  11. string(26) "/private/var/tmp/phpfyE3EC"
  12. ["error"]=>
  13. int(0)
  14. ["size"]=>
  15. int(19)
  16. }
  17. */

没有检测出来;

2.用pathinfo()函数来获取文件路径的信息

  1. $data = $_FILES['userfile'];
  2. // var_dump($data);
  3. var_dump(pathinfo($data['name']));
  4. /**结果**/
  5. /*
  6. array(4) {
  7. ["dirname"]=>
  8. string(1) "."
  9. ["basename"]=>
  10. string(8) "test.jpg"
  11. ["extension"]=>
  12. string(3) "jpg"
  13. ["filename"]=>
  14. string(4) "test"
  15. }
  16. */

没有检测出来;

3.PHP的扩展fileinfo(需要安装开启)

  1. $data = $_FILES['userfile'];
  2. $filename = $data['tmp_name'];
  3. $finfo = finfo_open(FILEINFO_MIME_TYPE);//返回 mime 类型。 自 PHP 5.3.0 可用。
  4. $mimetype = finfo_file($finfo, $filename);
  5. finfo_close($finfo);
  6. var_dump($mimetype);
  7. /**结果**/
  8. //string(10) "text/plain"

可!可!可!监测到文件mime类型并不是一个jpg!