2012-10-21 56 views
0

我知道安全问题通常来自用户输入,这就是为什么我假设$ eFlag!= 1的其他部分存在安全漏洞的原因。
我不熟悉PHP,所以我不是100%确定这里发生了什么。将文件上传到系统的安全问题

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

***这是张贴在我上学的俱乐部之一,并要求确定一个安全漏洞(换句话说,有一个肯定的)。在php.net

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

完整的示例检查MIME类型:

+1

无论上传什么内容,该脚本都会以.doc为扩展名。不确定这是否符合安全风险或简单的愚蠢。 – fvu

+0

究竟..所以如何确保它是一个doc文件?那么,如果它实际上是.doc文件,那么我将上传,而不是只上传任何内容,并在其上放置一个.doc扩展名。 – antz

+0

尽管.doc文件因其嵌入式恶意元素的脆弱性而众所周知,但相对安全的方法是检查文件的[签名](http://www.garykessler.net/library/file_sigs.html)。如果这是一个选项,我会首先确定文件类型(可以在保存的文件上使用适当的文件扩展名),然后通过virussscanner传递。 – fvu

回答

2

您应该检查上传文件的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'); 

你可以转储和使用条件来检查MIME类型作为例子:

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

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

注意:MIME类型可以伪造,因此我将通过$ _FILES,文件名长度通过文件名检查,类型和读取的代码第一行检查DOC或其他东西。在记事本中打开它的文档,看看你可以通过阅读文件在PHP中检查什么。

+0

谢谢!正是我需要的 – antz

0

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

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

间接方式将是有另一个调用文件包括使用include上传的文件等,所以你需要确保的是,如果论据include等是参数,该参数不能由用户输入操作,否则您很容易受到remote/local file inclusion的影响。