is_uploaded_file()的目的是什么?

时间:2011-11-24 19:50:55

标签: php

文档说:

  

如果文件名命名的文件是通过HTTP POST

上传的,则返回TRUE

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

  

这有助于确保恶意用户未尝试过   欺骗脚本处理它不应该的文件   工作 - 例如,/ etc / passwd。

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

is_uploaded_file()做其他检查吗?

感谢您放弃了一些亮点。

2 个答案:

答案 0 :(得分:25)

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

这不是很有用,因为如果在上传过程中没有问题,那么

is_uploaded_file($_FILES['blah']['tmp_name'])

总是会返回true

但是,请考虑自PHP 4.1.0以来$_FILES“仅”可用,而is_uploaded_file首先出现在PHP 4.0.3中。这里似乎合乎逻辑的结论是,在$_FILES超全局可用之前,很难让上传文件处理安全地工作。如果没有别的,可以注入非超级全局,并且非常容易注入,register_globals启用 - 这曾经是PHP的安全性的另一个痛点。

如果今天正在编写代码并使用像$_FILES这样的代码,那么我会说is_uploaded_file在其当前实现中是“无用的”,因为没有可以诱骗你进入的攻击向量处理“坏”文件。

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

答案 1 :(得分:10)

好吧,您可以将任何字符串传递给is_uploaded_file

当然,如果你直接从$_FILES传递了一些内容,那么当然它总会返回true,但是如果你自己形成了这个论点,那么它可能不会。{/ p>