4

I cannot imagine why should I use this function instead of a simple rename.

The manual writes:

move_uploaded_file

This function checks to ensure that the file designated by filename is a valid upload file (meaning that it was uploaded via PHP's HTTP POST upload mechanism). If the file is valid, it will be moved to the filename given by destination.

This sort of check is especially important if there is any chance that anything done with uploaded files could reveal their contents to the user, or even to other users on the same system.

Can you please write an example why is this so important?

4

3 回答 3

4

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

rename($source, $destination);

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

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

通常,这是您必须考虑的安全问题;这些_uploaded_file功能可以帮助您进入成功的深渊

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

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

  • 技术上不必要的可能仍然是一个好主意:我们正在谈论安全性,为什么不更加安全呢?
  • move_uploaded_files是在一个$_FILES甚至不存在的时候推出的,并且广泛使用的register_globals是现实而不是儿童恐怖故事。
于 2013-04-29T11:03:13.560 回答
-2

您不应该使用重命名函数,因为重命名函数用于用新名称重命名现有文件。而像 move_uploaded_file 和 copy 这样的函数实际上用于将文件从 tmp 目录上传到目标目录。

rename() 应该用于移动普通文件,而不是通过表单上传的文件。这样做的原因是因为有一个特殊的函数,称为 move_uploaded_file(),它会在移动文件之前检查以确保文件确实已上传 - 这可以阻止人们试图入侵您的服务器以使私有文件可见。如果您愿意,可以通过调用 is_uploaded_file() 函数自行执行此检查。

于 2013-04-29T10:58:04.377 回答
-2

move_uploaded_file实际上将您上传的文件从 tmp 目录移动到服务器上的永久位置。是的,这很重要,因为您必须将文件移动到您指定位置的服务器,对吗?

检查move_uploaded_file此处的代码片段示例:http: //www.developphp.com/view_lesson.php?v=449

于 2013-04-29T10:56:18.940 回答