最安全的文件 (图片) 限制上传

代码:...

代码:

  1. <?php
  2. if(($_FILES[“file”][“type”]==“image/gif”)||($_FILES[“file”][“type”] == “image/jpeg”)|| ($_FILES[“file”][“type”] == “image/pjpeg”)&&($_FILES[“file”][“size”] < 200000)){
  3. $type=".jpg";
  4. if($_FILES[“file”][“type”]==“image/gif”){
  5. $type=".gif";
  6. }else{
  7. $type=".jpg";
  8. }
  9. $name=$_FILES[“file”][“name”];
  10. //echo “##name:” . $name . “<br>”;
  11. if(strpos($name,";")){
  12. die();
  13. }
  14. //echo “##wait:” . $wait . “<br />”;
  15. $wait=explode(".",$name);
  16. $okname=$wait[0];
  17. echo “##name[0]:” . $wait[0] . “<br />”;
  18. $okname=$okname . $type;
  19. mkdir("./upload");
  20. echo “##type:” . $type . “<br />”;
  21. echo “##okname:” . $okname . “<br />”;
  22. echo “Upload: " . $_FILES[“file”][“name”] . “<br />”;
  23. echo “Type: " . $_FILES[“file”][“type”] . “<br />”;
  24. echo “Size: " . ($_FILES[“file”][“size”] / 1024) . " Kb<br />”;
  25. echo “Stored in: " . $_FILES[“file”][“tmp_name”];
  26. move_uploaded_file($_FILES[“file”][“tmp_name”],”./upload/” . $okname);
  27. }
  28. ?>
  29. <form action=”" method=“post” enctype=“multipart/form-data”>
  30. <input type=“file” name=“file”><input type=“submit”>
  31. </form>

使用的方法是将整个文件的扩展名改成 JPG 或 GIF。

其中 if(strpos($name,";")){ die(); } 是为了防止 IIS6 的解析漏洞,IIS6 在解析文件时如果遇到 hello.php;112233.jpg 这样的文件,会默认解析为 hello.php

为什么不直接在整个文件后面加上一个扩展名,像 hello.php.rar.mp4.jpg ? Apache 服务器解析时会将如 hello.php.avi.jpg 这样的文件取第一个“.”,解析成 hello.php,所以上面使用了 explode 方法

Licensed under CC BY-NC-SA 4.0