is_uploaded_file() 如何增加安全性?

Tes*_*son 4 php security

我理解它是因为该函数对

$_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)

mis*_*tin 5

这是我能找到的最好的信息......

根据 Chris Shiflett 的 Essential PHP Security 一书:

如果您的代码使用 tmp_name 而不验证它实际上是上传的文件(而不是类似 /etc/passwd 的文件),则存在理论上的风险。我将此称为理论上的风险,因为没有已知的漏洞允许攻击者修改 tmp_name。但是,不要因为没有利用漏洞而阻止您实施一些简单的保护措施。

但是,请记住,这是在 2005 年 10 月 20 日发布的。我不知道此后出现的任何漏洞利用,或者围绕“理论”漏洞利用的细节是什么。他也在这里谈论它。

安全堆栈交换上有一个类似的问题供进一步参考。