【问题标题】:PHP Upload Script not Functioning Properly with New HostPHP 上传脚本无法在新主机上正常运行
【发布时间】:2011-09-29 03:57:35
【问题描述】:

我设置了一个 php 脚本,它创建一个目录并将文件上传到该目录。我的问题是,当我使用脚本创建目录时,文件不会完全上传。我在不同的主机上运行了完全相同的脚本,上传过程运行良好。另外,如果我手动创建上传目录并通过 ftp 应用 chmod 777,则传输工作正常。是否需要更改托管服务提供商的某种设置以使该功能正常工作?

这是上传表格:

<form action="/uploadFile.php" method="post"
enctype="multipart/form-data">
<label for="img_preview">Preview Image:</label>
<input type="file" name="img_preview" id="img_preview" />
<br />

<input type="hidden" name="id" value="newDirectory" />
<input type="submit" name="submit" value="Upload Flyer" />
</form>

这是我的 PHP 脚本(uploadFile.php):

$thisdir = getcwd(); 
$new_dir = $_POST['id'];
$full_dir = $thisdir . "/upload/" . $new_dir;

function chk_dir($full_dir) {
if(is_dir($full_dir)) {
    echo 'welcome back';
} else {
    return mkdir($full_dir);
}

}
chk_dir($full_dir);
chmod($full_dir, 0777);
?>

<?php
//upload image

if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["img_preview"]["error"] . "<br />";
  }
else
  {

  }
  //set image restrictions
?> 

<?php
if ((($_FILES["img_preview"]["type"] == "image/gif")
|| ($_FILES["img_preview"]["type"] == "image/jpeg")
|| ($_FILES["img_preview"]["type"] == "image/pjpeg"))
&& ($_FILES["img_preview"]["size"] < 80000))
  {
  if ($_FILES["img_preview"]["error"] > 0)
    {
echo "Please only upload an image for previewing (jpg or gif)...<br>
Also, check to         make     sure the filesize is less than 8MB" .          $_FILES["img_preview"]["error"] .     "<br />";
}
  else
{

//check the image into new directory
if (file_exists("upload/". $new_dir ."/". $_FILES["img_preview"]["name"]))
  {
  echo "It seems that " . $_FILES["img_preview"]["name"] . " already exists.";
  }
else
  {
  move_uploaded_file($_FILES["img_preview"]["tmp_name"],
  "upload/" . $_POST['id'] . "/" . $_FILES["img_preview"]["name"]);
  echo "image file has transferred successfully!";
      }
    }
  }
else
  {
  echo "Invalid file please contact for assistance.";
  }
?> 

另外,当我运行脚本时,没有产生错误并且文件回显“图像文件已成功传输!”但是当我在新位置检查文件时,它是完全无效的。感谢您在此问题上的宝贵时间。

【问题讨论】:

    标签: php file-upload hosting chmod mkdir


    【解决方案1】:

    首先,您的脚本存在安全漏洞。永远不要使用传递的 $_POST 数据来创建系统目录。并且永远不要将 0777 用于任何事情。

    move_uploaded_file() 在失败时返回 false,即使失败(在您的代码中)您仍然会收到成功消息

    打开 display_errors 和错误记录,然后重试。

    【讨论】:

    • "永远不要使用传递的 $_POST 数据来创建系统目录。"我正在使用 $_POST 数据将目录与用户相关联。您是否建议我应该在上一步中执行此操作?或者您是否建议我将 $_POST 数据标识为单独的值,即 $newvalue = $_POST['id']; “而且永远不要将 0777 用于任何事情。”如果目录不是 777,如何允许站点用户上传到目录?
    • 我知道但是 $_POST 可以随时修改,您需要让用户注册,验证他们的用户名(字母数字,等字符),然后再将他们的数据存储到数据库中,一旦他们上传图像,您需要确保当前会话有效并使用数据库中的数据(您已在注册步骤中过滤)。
    【解决方案2】:

    您已独立使用move_uploaded_file()。如果它返回 false,那么sucsess 消息也会被打印出来。

    试试

    if ( move_uploaded_file($_FILES["img_preview"]["tmp_name"],
      "upload/" . $_POST['id'] . "/" . $_FILES["img_preview"]["name"])) {
    echo "sucess";
    }else{
    echo "fail";
    }
    

    之后,您将了解主要问题是什么。也使用调试点 print_r($_FILES)move_uploaded_file() 之前。

    【讨论】:

    • "也在 move_uploaded_file() 之前通过 print_r($_FILES) 使用调试点" 您能否详细说明这一步?您是否建议我在移动文件之前在页面上打印文件信息,以便我可以直观地看到它们的位置?
    【解决方案3】:

    这可能不是您问题的答案,但我希望仍然值得您关注。不要依赖$_FILES发送的文件类型,据我记忆这只是浏览器发送的mime-type,很容易被破解。使用getimagesize() 函数获取真实的图像类型以及高度/宽度。

    源文件名也是如此,但这不应构成安全漏洞。

    【讨论】:

      【解决方案4】:

      看起来您的问题已经包含答案(当您通过 FTP 创建目录时,上传工作)。

      我猜新服务器启用了安全模式,所以它会在文件操作中检查文件所有者的 UID。

      会发生什么:

      1. 您的脚本会创建一个目录,所有者将是 网络服务器
      2. 您的脚本(脚本的所有者通常是 ftp 用户)尝试 chmod 目录

      脚本(owner:ftp) 无法对目录(owner:webserver) 进行chmod,因为UID 不同。

      解决方案:使用ftp_mkdir() 创建目录。

      【讨论】:

      • 谢谢,这似乎是最能代表我的问题的答案。我尝试使用 ftp_mkdir() 函数,但这似乎也不起作用(即使我尝试了该函数的简化版本)。我将就 safe_mode 选项与主机联系,看看是否可以使 ftp_mkdir 或 mkdir 正常工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 2016-08-03
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多