2011-11-24 176 views
18

文件说:is_uploaded_file()的用途是什么?

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

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

这是有用的,以帮助确保恶意用户没有试图 招脚本插入文件后,它不应该是 工作的工作 - 例如,/ etc/passwd文件。

我知道我应该仔细检查文件内容和大小。但是,攻击者如何控制上传文件的临时文件名的

抑或is_uploaded_file()做一些其他检查?

感谢脱落一些轻。

+1

纠正:'is_uploaded_file()'不是'is_upload_file()'。 – MacMac

+0

由于'move_uploaded_file()'再次进行相同的检查,这也是多余的。 – mario

+0

@mario:不,这根本不是冗余的,因为你不会被迫与另一个打电话;你可以单独使用它们。 –

回答

9

那么,你可以通过任意字符串到is_uploaded_file

当然,如果你传递的东西直出$_FILES然后是的,当然它会始终返回true,但如果你形成了自己的说法随后也可能不是。

+0

+1为直接点。感谢Jon和Tomalak。 –

24

is_uploaded_file以当前的形式检查是否启用了文件上传(否则它不可能是上传的文件)并且提供的文件名实际上是由PHP生成的(我通过查看源代码获知)。

这是不是真的有帮助,因为如果在上载过程没有问题,那么

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

总是返回true

但是,考虑到$_FILES自PHP 4.1.0起“仅”可用,而is_uploaded_file首次出现在PHP 4.0.3中。这里似乎是合乎逻辑的结论是:这是一种很难获得上传的文件处理被做了$_FILES超全局之前可用安全工作。如果不出意外,非超全局变量可以注入,并很容易使启用register_globals - 这曾经是另一个痛点与PHP的安全性。

如果你今天正在编写代码并使用$_FILES就像一个人应该这样做,那么我认为is_uploaded_file在它的当前实现中是“无用的”,因为没有攻击向量可以诱使你处理一个“坏”文件。

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

1
bool is_uploaded_file (string $filename) 

如果文件名命名的文件是通过HTTP POST上传的,则返回TRUE。这有助于确保恶意用户没有试图欺骗脚本来处理它不应该工作的文件 - 例如/ etc/passwd。

如果有任何上传文件可能会向用户或甚至同一系统上的其他用户显示其内容,则此类检查尤为重要。

为了正常工作,功能is_uploaded_file()需要像

$_FILES['userfile']['tmp_name'], 

的说法 - 在客户机

$_FILES['userfile']['name'] 

不起作用在上传文件的名称。

来源:php手册