【问题标题】:Restrict name of uploaded file限制上传文件的名称
【发布时间】:2011-10-04 17:09:01
【问题描述】:

我正在使用以下代码供用户上传图片。

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

    if (file_exists("Template/" . $_FILES["companylogofile"]["name"]))
      {
      echo $_FILES["companylogofile"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["companylogofile"]["tmp_name"],
      "Template/" . $_FILES["companylogofile"]["name"]);
      }
    }
  }
else
  {
  echo "Invalid file";
  }

如您所见,我只接受 .jpeg 文件上传,但有大小限制。我还需要做的是对他们上传的文件的名称添加限制。基本上我只想允许上传文件,如果它们被命名为:Logo。有没有办法限制上传文件的名称?

谢谢!

【问题讨论】:

  • 您不能像对 FILE 数组的其他各个部分所做的那样,在顶部添加额外的 $_FILES["companylogofile"]["name"] 检查吗?
  • Billy 您可以在将上传的临时文件移动到目标位置时重命名上传的文件。例如,如果这是唯一有效的文件名,则始终重命名为 logo.jpg。
  • "模板/" 。 $_FILES["公司标志文件"]["名称"]);我已将其更改为: "Template/" 。 $_FILES["公司标志文件"]["标志.jpg"]);这就是你说的 hakre 吗?

标签: php file-upload restriction


【解决方案1】:
if (!preg_match("/logo/i", $_FILES["companylogofile"]["name"])) die("File have to contain 'logo' in name");

如果您正在寻找“Logo.jpg”,则可以通过

if ("Logo.jpg" != $_FILES["companylogofile"]["name"]) die("File have to contain 'logo' in name");

【讨论】:

    【解决方案2】:

    是的,只需测试$_FILES['companylogofile']['name']。示例:

    if (false === strpos(strtolower($_FILES['companylogofile']['name']), 'logo')) {
        echo 'Error!';
        unlink($_FILES['companylogofile']['tmp_name'];
        return;
    }
    

    但是,为什么要对上传设置如此烦人的限制呢?我希望你不会认为它会使它变得安全或任何东西?

    【讨论】:

    • 上传临时文件会在请求结束时自动删除。无需取消链接两次。
    【解决方案3】:

    什么是“坏”文件”Logo3?logo-with-some-long-rambling-filename?

    function isValidFileName($filename) {
       ... what do you want here?
    }
    
    if (!isValidFileName($_FILES['companylogoimage']['name'])) {
       die("Ooops, bad filename");
    }
    

    仅供参考:不要使用 $_FILES 数组中的 ['type'] 值进行验证。这是用户提供的文件的 mime 类型 - 它可以很容易地更改为对您撒谎。使用getimagesize() 之类的东西让服务器确定图像的类型。

    【讨论】:

    • 是的,除了普通的 Logo 之外的任何东西都是错误的文件名。
    • if ($_FILES['companylogoimage']['name'] != 'Logo') { ... bad image ... }
    【解决方案4】:

    是的,肯定有一种方法可以限制字符串格式。我建议您使用 preg_match http://php.net/manual/en/function.preg-match.php 考虑通过 PHP 使用 PERL 正则表达式

    如果您以前没有使用过正则表达式,它们只是一种通过压缩语法测试字符串格式的方法。可以在这里找到开始使用正则表达式的好地方:http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多