【问题标题】:Isn't Using the basename function with $_FILES['userFile']['name'] Redundant?将 basename 函数与 $_FILES['userFile']['name'] 一起使用是不是多余的?
【发布时间】:2011-01-21 18:26:33
【问题描述】:

根据the PHP Manualthe POST method uploads section$_FILES['userfile']['name'] 是客户端计算机上文件的原始名称。该部分中的示例 #2 使用带有 $_FILES['userfile']['name']basename 函数,如下所示:

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

我在本地主机(Apache 2.2.14、PHP 5.3.1、Windows XP)上做了一些实验,发现下面两行是等价的:

$_FILES['userFile']['name'];            // "file.txt"
basename($_FILES['userFile']['name']);  // "file.txt"

也就是说,将basename 函数与$_FILES['userFile']['name'] 一起使用似乎相当多余。不是吗?

【问题讨论】:

    标签: php file file-upload


    【解决方案1】:

    也就是说,使用带有 $_FILES['userFile']['name'] 的 basename 函数似乎相当多余。不是吗?

    不,首先是出于安全原因,正如@Gumbo 在他的回答中所描述的那样;其次,因为旧版本的 IE 用于在客户端传递文件的完整路径,例如

    C:\Documents and Settings\Username\Desktop\Image_cropped.jpg
    

    这种行为直到 IE8 才停止。来自this MSDN blog entry,通过this SO question发现:

    文件上传控件

    此外,“上传文件时包括本地目录路径”URLAction 已针对 Internet 区域设置为“禁用”。此更改可防止潜在敏感的本地文件系统信息泄露到 Internet。例如,Internet Explorer 8 现在将仅提交文件名 image.png,而不是提交完整路径 C:\users\ericlaw\documents\secret\image.png。

    【讨论】:

    • @Gordon 欢呼。 @Gumbo Re泄漏:是的,但是在内容管理系统中保存上传资源的原始位置非常有用。我真的很怀念那个功能。很高兴知道它可以使用区域模型重新激活。
    【解决方案2】:

    HTTP 请求可以被伪造,因此标头中提供的文件名也可以被操纵。

    如果您想确保只给出一个文件名,请验证该值或使用basename 对其进行过滤以获取文件名。

    【讨论】:

    • 是的,这是basename()在这里的最重要原因。
    • 例如,您可以收到../../../etc/passwd,因此,如果没有基本名称,您最终会收到/var/www/uploads/../../../etc/passwd == /etc/passwd
    【解决方案3】:

    在完整路径上使用 basename(),例如 /path/mydir/file.txt,返回 file.txt。当您有完整的解析路径并且只想获取路径的最后一部分时,它很有用。

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 2012-04-05
      • 2019-05-12
      • 2010-12-28
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多