is_uploaded_file()的目的是什么?

php
2022-08-30 19:46:48

文档说:

如果文件名命名的文件是通过 HTTP POST 上载的,则返回 TRUE

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

这对于帮助确保恶意用户没有试图诱骗脚本处理它不应该工作的文件(例如/etc/passwd)非常有用。

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

还是做一些其他检查?is_uploaded_file()

感谢您提供一些启示。


答案 1

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

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

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

总是会回来。true

但是,考虑到自 PHP 4.1.0 以来“仅”可用,而在 PHP 4.0.3 中首先出现。这里似乎合乎逻辑的结论是,在_FILES美元的超级全球可用之前,很难让上传的文件处理安全地工作。如果不出意外的话,非超全局变量可以被注入到其中,而且很容易被启用——这曾经是PHP安全性的另一个痛点。$_FILESis_uploaded_fileregister_globals

如果一个人今天正在编写代码并使用应该使用的方式,那么我会说在当前的实现中是“无用的”,因为没有攻击向量可以诱使你处理“坏”文件。$_FILESis_uploaded_file

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


答案 2

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

当然,如果你直接通过它的东西,那么是的,当然它总是会返回,但如果你自己形成论点,那么它可能不会。$_FILEStrue


推荐