is_uploaded_file()如何增加安全性?

时间:2017-01-19 14:38:17

标签: php security

我理解它,因为该功能可以对抗

$_FILES['nn']['tmp_name']

这个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;
    }
}

2 个答案:

答案 0 :(得分:4)

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

根据Chris Shiflett的Essential PHP Security一书:

  

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

然而,请记住,这是2005年10月20日发布的。我不知道任何已经浮出水面的漏洞,或者围绕着"理论"利用是。他也谈到了它here

security stack exchange上有一个类似的问题需要进一步参考。

答案 1 :(得分:1)

这对程序员来说实际上是一种健全性检查。没有任何用户("黑客")可以做的事情会使tmp_name引用除刚刚上传的文件之外的任何内容。但是,在您的代码中,您可能会以复杂的方式传递文件名;为了避免在这种情况下出现编程错误is_uploaded_file为您提供了一个工具来检查您是否真正使用刚刚上传的文件,或者您是否正在尝试使用其他一些文件。在后一种情况下,如果您的代码[在某些情况下]错误地使用任何文件而不是仅仅上传文件,则攻击者可能能够利用该错误并获得访问权限对文件他们不应该。