Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 上传的文件如何增加安全性?_Php_Security - Fatal编程技术网

Php 上传的文件如何增加安全性?

Php 上传的文件如何增加安全性?,php,security,Php,Security,我的理解是,该函数与 $_FILES['nn']['tmp_name'] 这个tmp_名称是由php在服务器上创建的,并且(据我所知)不能被客户端操纵。函数在什么意义上是\u上传的\u file()增加了安全性 源代码: /* {{{ proto bool is_uploaded_file(string path) Check if file was created by rfc1867 upload */ PHP_FUNCTION(is_uploaded_file) { cha

我的理解是,该函数与

$_FILES['nn']['tmp_name']
这个tmp_名称是由php在服务器上创建的,并且(据我所知)不能被客户端操纵。函数在什么意义上是\u上传的\u 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;
    }
}

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

根据Chris Shiflett的《基本PHP安全》一书:

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

但是,请记住,这是2005年10月20日发布的。我不知道此后出现了任何漏洞,也不知道围绕“理论”漏洞的细节是什么。他也谈到了这一点


还有一个类似的问题供进一步参考。

这实际上是对程序员的一个理智检查。任何用户(“黑客”)都无法使
tmp\u name
引用除刚刚上传的文件以外的任何内容。然而,在代码中,您可能以复杂的方式传递文件名;为了避免在这种情况下出现编程错误,
is\u uploaded\u file
为您提供了一个工具,用于检查您是否正在使用刚刚上载的文件,或者是否正在尝试使用其他文件。在后一种情况下,如果您的代码[在某些情况下]错误地处理任何文件而不是仅上载的文件,则攻击者可能会利用该错误获得不应该访问的文件。

您的意思是?@mistermartin是的。在不篡改实际php脚本的情况下,远程客户端如何成功地(从手册中):“诱使脚本处理它不应该处理的文件——例如,/etc/passwd”Ok。我想我明白了。黑客可以尝试发送包含绝对路径的文件,例如“/etc/password”。浏览器不允许这样做,但黑客可以操纵请求,在www用户安全性不好的情况下,php可以通过查看绝对路径而不理解它是路径而不是文件名来覆盖文件。这可能应该在php中更正。我无法解释源代码。感谢所有的澄清。看着,Jon指出这个函数是无用的。我仍然很好奇,如果函数查看的是“name”,而不仅仅是“tmp_name”,而且浏览php源代码都超出了我的舒适范围。@user247245手册中说:“为了正常工作,函数
是上传的文件()
需要像
$\u FILES['userfile']['tmp_name'这样的参数。”
,-客户端计算机上上载文件的名称
$\u FILES['userfile']['name']
不起作用”。