PHP - 为什么要使用move_uploaded_file而不是重命名?

时间:2016-11-28 11:10:20

标签: php file-upload

在手册中,我可以看到有关安全原因的说法,但我不太明白什么是有问题的情况。

  

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

     

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

所以它确保它是通过PHP上传的,但如果它不会检查,会发生什么?什么信息可以揭示,以及如何?

有人可以解释一下吗?一个例子很棒。

2 个答案:

答案 0 :(得分:0)

在这种情况下的安全问题是上传目录对公众可见。

为了避免这种情况,您需要配置您的Web服务器(如Apache)以禁止公共目录。

此外,每当您通过PHP脚本上传文件时,请重命名具有混合字符的文件。

例如,您可以将加密时间戳与实际文件名结合使用。

处理文件上传似乎很常见。您可以坚持这种方式安全地处理文件上传。

<强>编辑:

根据您在评论中提出的问题编辑此答案。

您需要在任何www目录中包含现有文件,才能使用rename($existing_old_file_name, $new_file_name)函数重命名该文件。

move_uploaded_file($tmp_uploaded_file_name, $new_file_name)函数将上传的文件从tmp目录移动到您指定的目标,作为函数中的第二个参数。

答案 1 :(得分:0)

PHP脚本可能会移动其名称在运行时确定的文件(刚刚上传的临时文件的名称)。检查旨在确保编写不良的脚本不会暴露系统文件或包含身份验证机密的文件。

假设我编写了一个脚本,允许您将图像上传到我的服务器,通过嵌入我提供的一些超级可爱的猫咪GIF来增强它,并再次下载。要跟踪您正在处理的图像,我将文件名嵌入到编辑按钮的请求网址中:

http://example.com/add-kitty.php?img=ato3508.png&add=kitty31.gif

或许我在cookie或POST数据中嵌入相同的信息,错误地认为这使它更安全。然后一些适度进取的脚本小家伙来试试这个(或POST / cookie等价物):

http://example.com/add-kitty.php?img=$2Fetc%2Fpasswd&add=kitty31.gif

看到了吗?这是路径/etc/passwd,网址编码。哎呀!您可能刚刚下载了/etc/passwd文件,中间有一点小猫声。

显然,这不是一个完整的工作漏洞,但我相信你明白了:move_uploaded_file函数进行了额外的检查,以保护你免受攻击,这些攻击会在你的代码中注入一个非预期的文件名。