php - move_uploaded_file - 为什么它很重要?

inf*_*rno 4 php file-upload

我无法想象为什么我应该使用这个函数而不是简单的重命名。

手册写道:

移动上传文件

该函数检查以确保 filename 指定的文件是有效的上传文件(意味着它是通过 PHP 的 HTTP POST 上传机制上传的)。如果文件有效,它将被移动到目标指定的文件名。

如果对上传文件所做的任何操作有可能向用户甚至同一系统上的其他用户泄露其内容,则这种检查尤其重要。

您能写一个例子为什么这如此重要吗?

Jon*_*Jon 5

因为为此目的使用常规文件系统函数可能会产生安全漏洞。如果您在程序中这样做:

rename($source, $destination);
Run Code Online (Sandbox Code Playgroud)

并且攻击者能够控制 的值$source,他们获得了重命名(或移动!——rename也跨目录移动文件)PHP 进程有权访问的任何文件的能力。

如果他们还可以影响文件$destination,或者在文件移动后有某种方式可以访问文件的内容,那么他​​们至少可以利用此漏洞来访问您的源代码,这通常会泄露身份验证凭据。不难想象这种情况会发生:如果您接受用户上传并使其可通过 URL 访问,则此功能将已内置到您的应用程序中。

一般来说,这是一个你必须考虑的安全问题;这些_uploaded_file功能可以帮助您迈向成功的深渊

更新(从评论中提取的材料):

文件上传的现代处理(通过$_FILES)在技术上很大程度上变得move_uploaded_file不必要。但不要忘记:

  • 技术上不必要的可能仍然是一个好主意:我们正在谈论安全,为什么不更加安全呢?
  • move_uploaded_files引入的时候$_FILES甚至不存在并且广泛使用的register_globals是现实而不是儿童恐怖故事。

  • @inf3rno:“$_FILES”的数量是 PHP 的一项功能。事实上,“rename”的第一个参数直接来自“$_FILES”内部,这是由于您自己的代码而不是其他人造成的。此外,“move_uploaded_file”早于“$_FILES”的引入;那时 `register_globals` 仍然是一个东西。所以它在今天看来确实没那么有用,但它已经存在了很长时间了。 (3认同)
  • php.init 文件包含选项“open_basedir”(http://www.php.net/manual/en/ini.core.php#ini.open-basedir),使用它可以防止 PHP 应用程序读取外部文件它的根目录,在这种情况下只有 move_upload_file 可以从 /tmp 目录读取上传的文件。它提高了安全性,因为它可以保护同一服务器上的网站免受彼此的影响,也可以防止上传的恶意脚本破坏更多其上传的应用程序。 (2认同)