我有这个破坏的PHP上传脚本

时间:2010-05-25 04:52:54

标签: php image file

我有这个脚本用于从表单上传图像和内容,它在一个项目中工作,但在另一个项目中工作。我花了几个小时试图调试它,我希望有人可以指出我可能遇到的问题。哪里有评论是我试图调试的地方。我得到的第一个错误是最后一条评论开头的“回声无效文件”。随着这些特定区域注释掉我应该从表单中获取的上传名称和类型没有得到回应,我认为这是错误发生的地方,但似乎无法找到它。感谢。

    <?php
include("../includes/connect.php");
/*
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 2000000))
  {
    */
  if ($_FILES["file"]["error"] > 0) 
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

        /* GRAB FORM DATA */
    $title = $_POST['title'];
    $date = $_POST['date'];
    $content = $_POST['content'];
    $imageName1 = $_FILES["file"]["name"];

    echo $title;
    echo "<br/>";
    echo $date;
    echo "<br/>";
    echo $content;
    echo "<br/>";
    echo $imageName1;

    $sql = "INSERT INTO blog (title,date,content,image)VALUES(
    \"$title\",
    \"$date\",
    \"$content\",
    \"$imageName1\"
    )";

    $results = mysql_query($sql)or die(mysql_error());

    echo "<br/>";


    if (file_exists("../images/blog/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "../images/blog/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "../images/blog/" . $_FILES["file"]["name"];
      }
    }

  /*
  }
else
  {
  echo "Invalid file" . "<br/>";
  echo "Type: " . $_FILES["file"]["type"] . "<br />";
  }
  */

  //lets create a thumbnail of this uploaded image.
  /*
    $fileName = $_FILES["file"]["name"];
    createThumb($fileName,310,"../images/blog/thumbs/");
    function createThumb($thisFileName, $thisThumbWidth, $thisThumbDest){
    $thisOriginalFilePath = "../images/blog/". $thisFileName;
    list($width, $height) = getimagesize($thisOriginalFilePath);
    $imgRatio =$width/$height;
    $thisThumbHeight = $thisThumbWidth/$imgRatio;
    $thumb = imagecreatetruecolor($thisThumbWidth,$thisThumbHeight);
    $source = imagecreatefromjpeg($thisOriginalFilePath);
    imagecopyresampled($thumb, $source, 0, 0, 0, 0, $thisThumbWidth,$thisThumbHeight, $width, $height);
    $newFileName = $thisThumbDest.$thisFileName;
    imagejpeg($thumb,$newFileName, 80);
    echo "<p><img src=\"$newFileName\" /></p>";

    //header("location: http://www.google.ca");

    }

    */





?>

4 个答案:

答案 0 :(得分:2)

也许您忘记将enctype="multipart/form-data" method="post"添加到HTML表单中,或者HTML中没有<input type="file" name="file" id="file" value=""/>

答案 1 :(得分:0)

错误出现在html表单文件中,我在method =“post”和enctype =“multi / form-data”旁边添加了一个名称=“something”,显然这是不受欢迎的。感谢RC指出我正确的方向。我不太清楚为什么要这样做。

答案 2 :(得分:0)

以下是您的脚本存在的一些问题:

  1. $ _FILES数组中的'error'值不仅仅是一个布尔值,它会告诉您上传是否成功,或者它失败的原因。错误代码定义为here

  2. 'type'值由远程客户端提供。它不是由Web服务器或PHP决定的。因此,基于该值进行mime类型验证是一个主要漏洞:伪造所提供的类型值是微不足道的。最好使用服务器端方法(如fileinfo)来确定实际的mime类型。

  3. 您盲目地将表单数据插入到插入查询中,这使您对SQL注入攻击持开放态度。在构建查询之前至少通过mysql_real_escape_string()传递数据,或者更好的是,使用PDO和参数化查询

  4. 您使用原始客户提供的名称存储文件。你至少检查一下文件名是否已经被使用,防止上传冲突/覆盖,但也有一种情况,客户端的操作系统/文件系统允许服务器的OS / FS没有的文件名中的字符,这可能导致微妙的文件“消失了“错误,或覆盖完全不同的文件,因为无效字符被过滤掉或翻译成其他东西。由于您使用数据库存储有关上载的信息,您可以将原始文件名存储在该表中,并使用表的主键(auto_increment int,对吗?)作为文件名。

  5. 不是真正的问题,但就效率而言,您无需在拇指创建功能中使用getimagesize()。 GD具有imagesx()imagesy(),它从GD图像句柄获取像素大小。 getimagesize()独立于GD,因此您打开并解析源图像两次。同样,这不是一个真正的问题,但在繁忙的网站上,只打开一次图像可能是一个不错的CPU时间和内存使用节省。

答案 3 :(得分:-1)

$ _ FILES [“file”] [“error”]不仅仅是一面旗帜 它有错误代码 在手册中解释