我理解它是因为该函数对
$_FILES['nn']['tmp_name']
Run Code Online (Sandbox Code Playgroud)
这个 tmp_name 是由 php 在服务器上创建的,不能(据我所知)由客户端操作。函数 is_uploaded_file() 在什么意义上增加了安全性?
源代码:
/* {{{ proto bool is_uploaded_file(string path)
Check if file was created by rfc1867 upload */
PHP_FUNCTION(is_uploaded_file)
{
char *path;
size_t path_len;
if (!SG(rfc1867_uploaded_files)) {
RETURN_FALSE;
}
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_STRING(path, path_len)
ZEND_PARSE_PARAMETERS_END();
if (zend_hash_str_exists(SG(rfc1867_uploaded_files), path, path_len)) {
RETURN_TRUE;
} else {
RETURN_FALSE;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我能找到的最好的信息......
根据 Chris Shiflett 的 Essential PHP Security 一书:
如果您的代码使用 tmp_name 而不验证它实际上是上传的文件(而不是类似 /etc/passwd 的文件),则存在理论上的风险。我将此称为理论上的风险,因为没有已知的漏洞允许攻击者修改 tmp_name。但是,不要因为没有利用漏洞而阻止您实施一些简单的保护措施。
但是,请记住,这是在 2005 年 10 月 20 日发布的。我不知道此后出现的任何漏洞利用,或者围绕“理论”漏洞利用的细节是什么。他也在这里谈论它。