【问题标题】:php file upload problemphp文件上传问题
【发布时间】:2011-02-28 20:49:39
【问题描述】:

此代码在我的本地主机中正常工作。我正在使用 xampp 1.7.3。但是当我将它放在实时服务器中时,它会显示Possible file upload attack!。 “upload/”是服务器上“public_html”文件夹下的文件夹。我可以通过该目录中的其他脚本上传文件。

<?php

$uploaddir = '/upload/';//I used C:/xampp/htdocs/upload/ in localhost. is it correct here?
$uploadfile = $uploaddir . basename($_FILES['file_0']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['file_0']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\\n";
} else {
    echo "Possible file upload attack!\\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

【问题讨论】:

  • 检查 /upload/ 的文件夹权限
  • 首先,你应该检查 $_FILES['file_0'] 是否存在,因为如果根本没有上传文件,它会报告“可能的文件上传攻击”,这很有趣。

标签: php file-upload


【解决方案1】:

您可能无法将文件移动到/upload/,这是服务器文件系统根目录下的“上传”文件夹,因此move_uploaded_file() 报告FALSE 和您的消息。另外,这个/upload/ 文件夹可能根本不存在,也不能写。

您可能希望将其移动到$_SERVER['DOCUMENT_ROOT'].'/upload/',它将指向您的虚拟主机根目录(类似于 www 或您上传应用程序文件的任何位置)。不要忘记创建此文件夹并相应地更改其权限(CHMOD 777 是个好主意)。

【讨论】:

  • 我刚刚注意到这一点,然后看到了所有这些答案。谢谢!
【解决方案2】:

问题是文件名中的前导斜杠。虽然它可能会在您的 XAMPP 机器上正确解析,但它在您的服务器上时,前导斜杠会尝试将它放在文件系统根目录中。

猜测这是一种攻击,因为人们有时可以捏造传入的参数,将有害文件放到他们可以执行的地方!

【讨论】:

    【解决方案3】:

    $uploaddir 很可能是错误的。使用

    echo dirname(__FILE__);
    

    获取网络服务器上根文件夹的真实完整路径,然后放置类似

    /web/real/path/to/root/upload
    

    作为路径。

    【讨论】:

    • 如果使用 PHP 5.3,则只需 __DIR__ ;-)
    【解决方案4】:

    为什么不这样做:

    $uploaddir = './upload';
    

    这将与您的脚本所在的位置相关,这是意图吗?否则你需要完整的目录(来自系统根目录)

    【讨论】:

      【解决方案5】:

      试试这个代码

       $fltype=$_FILES['userfile']['type']; 
          echo $fltype."<br>";
          /*if($_FILES['userfile']['type'] != "image/gif") {
          echo "Sorry, we only allow uploading GIF images";
          exit;
          }*/
      
      $uploaddir = 'uploads/';
      $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
      $imgname=basename($_FILES['userfile']['name']);
      $desc=$_POST["desc"];
      echo "<br>".$imgname."<br>";
      if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
          echo "File is valid, and was successfully uploaded.\n";
      } else {
          echo "File uploading failed.\n";
      }
      $con=mysql_connect("localhost","root","");
      $select=mysql_select_db("n1",$con);
      $sql="insert into tblimage (imagename,description) values('$imgname','$desc')";
      echo "<br>".$sql;
      $rs=mysql_query($sql);
      if($rs)
      {
          echo "<br>Record inserted in table.<br>";
      }
      else
      {
      echo "<br>Error in table insersion.<br>";
      }
      echo "<br><br>uploaded image is::::<br><br>";
      echo "<img src='$uploadfile' />";
      ?> 
      

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题,上传脚本在 localhost 上工作,但出现了可能的文件攻击错误!在主机服务器上。

        我通过授予 777 上传文件夹的权限来修复它。转到ftp并右键单击文件夹并选择属性。勾选所有框(读/写/执行)并授予 777 权限。

        还可以编辑 php.ini 文件,通常在 linux 上的 etc/ 文件夹中。 将以下设置更改为

        upload_max_filesize : 1024M post_max_size : 1024M 最大执行时间:6000 最大输入时间:6000 内存限制:128M

        你可以下载putty使用SSH终端访问linux服务器。

        祝你好运

        【讨论】:

        • 777 存在一些安全漏洞,请先尝试使用 767 ——它更安全。
        猜你喜欢
        • 2010-09-26
        • 1970-01-01
        • 1970-01-01
        • 2013-02-18
        • 2019-01-22
        相关资源
        最近更新 更多