我知道安全问题通常来自用户输入,这就是为什么我假设 $eFlag!=1 的 else 部分存在安全漏洞。
我不熟悉 php,所以我不能 100% 确定这里发生了什么。
我假设正在上传的文件本身可能是一些恶意可执行文件并且没有被检查???如果是这样,有没有办法阻止上传可执行文件或只上传 .doc 文件(看起来这是程序想要的文件)?
***这是张贴在我上学的一个俱乐部上,并要求找出一个安全漏洞(换句话说,肯定有一个)。
我知道安全问题通常来自用户输入,这就是为什么我假设 $eFlag!=1 的 else 部分存在安全漏洞。
我不熟悉 php,所以我不能 100% 确定这里发生了什么。
我假设正在上传的文件本身可能是一些恶意可执行文件并且没有被检查???如果是这样,有没有办法阻止上传可执行文件或只上传 .doc 文件(看起来这是程序想要的文件)?
***这是张贴在我上学的一个俱乐部上,并要求找出一个安全漏洞(换句话说,肯定有一个)。
您应该检查上传文件的 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 或其他内容。在记事本中打开它 doc,看看你可以通过读取文件在 PHP 中检查什么。
通常,可以通过两种方式调用上传的文件:直接或间接。
直接的方法是通过它的 URL 调用它。在这种情况下,文件扩展名会提示 Web 服务器如何处理它。因此,您需要确保该文件未使用可执行的文件扩展名(即 not .php
)存储,或者文件存储在无法通过 HTTP 访问的位置。
间接的方法是让另一个调用的文件包含使用include
等上传的文件。因此,您需要确保如果include
等的参数被参数化,则该参数不能被用户输入操作,否则您很容易受到远程攻击/本地文件包含。