PHP文件上传脚本无法正常运行

时间:2011-03-14 16:32:12

标签: php file-upload

这是我的php文件上传脚本。它根本不起作用。什么都没发生。我可能错过了一些东西。

<?php
if ((($_FILES["thumbfile"]["type"] == "image/gif")
|| ($_FILES["thumbfile"]["type"] == "image/jpeg")
|| ($_FILES["thumbfile"]["type"] == "image/pjpeg"))
&& ($_FILES["thumbfile"]["size"] < 20000))
  {
  if ($_FILES["thumbfile"]["error"] > 0)
    {
      move_uploaded_file($_FILES["thumbfile"]["tmp_name"],
     "http://www.divethegap.com/update/z-images/admin/upload/" . $_FILES["thumbfile"]["name"]);
      $filelocation = "http://www.divethegap.com/update/z-images/admin/upload/" . $_FILES["thumbfile"]["name"];

      echo '<script type="text/javascript">
parent.document.getElementById("thumbprogress").innerHTML = "Archiving"</script>Archiving';

    }
  }
else
  {
  echo '<script type="text/javascript">
parent.document.getElementById("thumbprogress").innerHTML = "Invalid File Format"</script>Invalid File Format';
  }
?>

有人能看到问题吗?

非凡

1 个答案:

答案 0 :(得分:3)

move_uploaded_file()并非旨在将URL作为目标。您实际上是在尝试获取上传的文件,然后再次上传。您想要使用的是LOCAL文件路径,其中没有URL。

最重要的是,您使用$ _FILES数组中提供的'type'和'size'数据进行验证。这些字段是用户提供的,可以被破坏。没有任何说恶意用户无法上传“hackme.exe”或“subvert_my_server.php”并将其标记为图像/ jpeg类型上传,您的脚本将很乐意尝试存储在服务器上。

为了正确处理,这样的事情会更好:

if ($_FILES['thumbfile']['error'] === UPLOAD_ERR_OK) {
    $info = getimagesize($_FILES['thumbfile']['tmp_name']);
    if (($info[2] !== IMG_GIF) && ($info[2] !== IMG_JPEG)) { // whoops. had || initially.
       die("not a gif/jpg");
    }
    if (filesize($_FILES['thumbfile']['tmp_name']) > 20000) {
       die("larger than 20000");
    }
    move_uploaded_file($_FILES['thumbfile']['tmp_name'], '/some/directory/on/your/server/filename.jpg');
}