我无法想象为什么我应该使用这个函数而不是简单的重命名。
手册写道:
move_uploaded_file
此函数检查以确保文件名指定的文件 是一个有效的上传文件(意味着它是通过PHP的HTTP上传的 POST上传机制)。如果文件有效,它将被移动到 目的地给出的文件名。
如果有任何机会,这种检查尤其重要 任何完成上传文件的内容都可以将其内容透露给 用户,甚至是同一系统上的其他用户。
请你写一个例子,为什么这么重要?
答案 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()函数来自行执行此检查。