文件说:
如果通过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_file
PHP 4.0.3首先出现.这里似乎合乎逻辑的结论是,在$_FILES
超全局可用之前,上传文件处理很难安全工作.如果不是其他的话,非超级全局可以注入,并且很容易被register_globals
启用 - 这曾经是PHP的安全性的另一个痛点.
如果今天正在编写代码并且使用$_FILES
类似的代码,那么我会说它is_uploaded_file
当前的实现是"无用的",因为没有攻击向量可以欺骗你处理"坏"文件.
然而,还有另一种看待事物的方式:is_uploaded_file
保证现在和将来都能正常工作,只要它可用,无论上传文件的机制是什么,并让程序员可以使用它们.也许现在它没有提供任何具体的东西,但它是对"安全文件上传"概念的抽象,它带有保证.我认为没有这样的保证$_FILES
(再次,即使我认为如果目前的现状"变得更糟",它也会成为一种回归).
Lig*_*ica 11
好吧,你可以传递任何字符串is_uploaded_file
.
当然,如果你直接传递了一些东西,$_FILES
那么它当然会永远回归true
,但如果你自己形成论证,那么它可能不会.