php - move_uploaded_file - 为什么重要?

时间:2013-04-29 10:53:08

标签: php file-upload

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

手册写道:

  

move_uploaded_file

     

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

     

如果有任何机会,这种检查尤其重要   任何完成上传文件的内容都可以将其内容透露给   用户,甚至是同一系统上的其他用户。

请你写一个例子,为什么这么重要?

3 个答案:

答案 0 :(得分:3)

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

rename($source, $destination);

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

如果它们也可以影响$destination,或者如果有一些方法可以在移动文件后获取对文件内容的访问权限,则可以使用此漏洞至少获取对源代码的访问权限,通常会显示身份验证凭据。并且不难想象会发生这种情况:如果您接受用户上传并通过URL访问它们,则此功能已经内置到您的应用程序中。

一般来说,这是一个你必须考虑的安全问题; _uploaded_file函数可帮助您登陆pit of success

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

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

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

答案 1 :(得分:-1)

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

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

答案 2 :(得分:-1)

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

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