is_uploaded_file()的目的是什么?

Ser*_*ier 18 php

文件说:

如果通过HTTP POST上传由filename命名的文件,则返回TRUE

怎么$_FILES['blah']['tmp_name']可能不是POST上传的结果?PHP创建了这个文件名.

这有助于确保恶意用户没有试图欺骗脚本处理不应该工作的文件 - 例如/ etc/passwd.

我明白我应该仔细检查文件内容和大小.但是攻击者怎么能控制上传文件的临时文件名呢?

还是is_uploaded_file()做其他检查?

谢谢你放弃了一些亮点.

Jon*_*Jon 26

在其当前形式中,is_uploaded_file检查文件上载是否已启用(否则它不可能是上载的文件),并且提供的文件名实际上是由PHP生成的(我从查看源代码知道这一点).

这不是真的有用,因为如果在上传期间没有问题那么

is_uploaded_file($_FILES['blah']['tmp_name'])
Run Code Online (Sandbox Code Playgroud)

永远都会回来true.

但是,考虑到$_FILES自PHP 4.1.0以来"仅"可用,而is_uploaded_filePHP 4.0.3首先出现.这里似乎合乎逻辑的结论是,$_FILES超全局可用之前,上传文件处理很难安全工作.如果不是其他的话,非超级全局可以注入,并且很容易被register_globals启用 - 这曾经是PHP的安全性的另一个痛点.

如果今天正在编写代码并且使用$_FILES类似的代码,那么我会说它is_uploaded_file当前的实现是"无用的",因为没有攻击向量可以欺骗你处理"坏"文件.

然而,还有另一种看待事物的方式:is_uploaded_file保证现在和将来都能正常工作,只要它可用,无论上传文件的机制是什么,并让程序员可以使用它们.也许现在它没有提供任何具体的东西,但它是对"安全文件上传"概念的抽象,它带有保证.我认为没有这样的保证$_FILES(再次,即使我认为如果目前的现状"变得更糟",它也会成为一种回归).


Lig*_*ica 11

好吧,你可以传递任何字符串is_uploaded_file.

当然,如果你直接传递了一些东西,$_FILES那么它当然会永远回归true,但如果你自己形成论证,那么它可能不会.