我无法想象为什么我应该使用这个函数而不是简单的重命名。
手册写道:
移动上传文件
该函数检查以确保 filename 指定的文件是有效的上传文件(意味着它是通过 PHP 的 HTTP POST 上传机制上传的)。如果文件有效,它将被移动到目标指定的文件名。
如果对上传文件所做的任何操作有可能向用户甚至同一系统上的其他用户泄露其内容,则这种检查尤其重要。
您能写一个例子为什么这如此重要吗?
因为为此目的使用常规文件系统函数可能会产生安全漏洞。如果您在程序中这样做:
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是现实而不是儿童恐怖故事。