从文件上传到系统的安全问题

时间:2012-10-21 22:09:08

标签: php security file-upload

我理解安全问题通常来自用户输入,这就是我假设$ eFlag!= 1的else部分存在安全漏洞的原因。 我不熟悉php所以我不是100%肯定这里发生了什么。

我假设正在上传的文件本身可能是某些恶意可执行文件而且未被检查??? 如果是这样,有没有办法阻止上传可执行文件或只是上传.doc文件(看起来像是程序想要的文件)?

***这张贴在我上学的一个俱乐部上,并被要求识别一个安全漏洞(换句话说,肯定有一个)。

2 个答案:

答案 0 :(得分:2)

您应该检查上传文件的mime类型:

strcmp(substr(mime_content_type($_FILES['userfile']['tmp_name']),0,4),"doc"

在php.net上检查mime类型的完整示例:http://php.net/manual/en/function.mime-content-type.php

添加了文件名和长度过滤器的完整代码(这是基于文件名):

$match = preg_match_all("/^[a-zA-Z0-9]/$", $_FILES['userfile']['name'], $matchif);

if (!$matchif)
{
    die('not allowed filename');
}

if (strlen($_FILES['userfile']['name']) > 255 || strlen($_FILES['userfile']['name'] == 0))
{
    die('Filename length not allowed');
}

if (strcmp(substr(mime_content_type($_FILES['userfile']['name']),0,4),"doc")==0) 
{ 

    if (move_uploaded_file($_FILES['userfile']['tmp_name']))
    {
        // upload file
    }
    else die('not upload');

}
else die('support only doc');

您可以转储和使用条件来检查mimetypes作为示例:

var_dump($_FILES['userfile']['type']);

if ($_FILES['userfile']['type'] == 'application/msword') { ... move uploaded files ...  }

注意:mime类型可以伪造,所以我将通过文件名检查,类型通过$ _FILES,文件名长度,并读取第一行代码来检查DOC或其他东西。在记事本中打开它,通过阅读文件查看可以在PHP中查看的内容。

答案 1 :(得分:0)

通常,有两种方法可以直接或间接调用上传的文件。

直接的方式是通过其URL调用它。在这种情况下,它是文件扩展名,为Web服务器提供了如何处理它的提示。因此,您需要确保文件未存储可执行文件扩展名(即不是.php),或者文件存储在无法通过HTTP访问的位置。

间接方式是让另一个被调用的文件包含使用include等的上传文件。所以你需要确保如果参数化了include等的参数,那么参数不能被用户输入操纵,否则你很容易受到remote/local file inclusion的攻击。<​​/ p>