【问题标题】:ZipArchive class PHP security issueZipArchive 类 PHP 安全问题
【发布时间】:2012-07-02 17:43:17
【问题描述】:

我有以下 PHP 代码

// Check if the upload is setted
if
(
    isset($_FILES['file']['name']) && !empty($_FILES['file']['name']) && 
    isset($_FILES['file']['type']) && !empty($_FILES['file']['type']) &&
    isset($_FILES['file']['size']) && !empty($_FILES['file']['size'])
)
{
    $UploadIsSetted = true;
    $UploadIsBad = false;

    $UploadExtension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);

    // Check if the upload is good
    require "../xdata/php/website_config/website.php";
    $RandomFoo = rand(1000999999,9999999999);

    if (($_FILES["file"]["size"] < ($MaxAvatarPictureSize*1000000)))
    {
        if ($_FILES["file"]["error"] > 0)
        {
            $UploadIsBad = true;
            $hrefs->item(0)->setAttribute("Error","true");
            $hrefs->item(0)->setAttribute("SomethingWrong","true");
        }
        else
        {
            move_uploaded_file($_FILES["file"]["tmp_name"],"../upload/tmp/".$RandomFoo.".file");    
        }
    }
    else
    {
        // The file is too big
        $UploadIsBad = true;
        $hrefs->item(0)->setAttribute("Error","true");
        $hrefs->item(0)->setAttribute("UploadTooBig","true");
    }
}
else
{
    $UploadIsSetted = false;
}

$ZipFile = new ZipArchive;
$ZipFile->open('../upload/tmp/'.$LastFilename.'.zip',ZIPARCHIVE::CREATE);
$ZipFile->addFile('../upload/tmp/'.$RandomFoo.'.file',$RandomFoo.".".$UploadExtension);
$ZipFile->close();

现在我最担心的是用户可以上传任何内容,所以我该如何防止:

  • 上传 2GB 3GB 文件
  • 正在加载
  • 上传某种扭曲的漏洞,最终会改变我的服务器安全
  • 缓冲区溢出
  • 具有任意代码注入的文件名

我的意思是,这个脚本有多安全?

我现在正在运行windows,我将切换到linux

【问题讨论】:

标签: php linux security


【解决方案1】:

您的其他四个问题:

正在加载

这是复杂的部分。让我谷歌你一些想法:

上传某种扭曲的漏洞,最终会改变我的服务器 安全

使用命令行病毒扫描程序(f-protclamav)扫描上传的文件。您可能会在 PHP 本身中使用一个简单的正则表达式扫描程序(例如,探测图像文件中的 HTMLish 内容),但这并不是一个实际的安全功能;不要重新发明轮子。

缓冲区溢出

PHP 通常不易受缓冲区溢出的影响。

好吧,开玩笑。但是你不能在用户空间做任何事情。但是推动字符串并不是什么大问题。这在脚本语言中非常可靠且不可利用,只要您知道如何在哪种情况下转义即可。

具有任意代码注入的文件名

至少您应该最总是使用basename() 来避免路径遍历漏洞。如果您想保留用户指定的文件名,则可以使用正则表达式白名单。 =preg_replace('/[^\w\s.]/', '', $fn) 作为粗略的例子。

【讨论】:

  • 非常感谢,非常有用:) 很高兴阅读所有这些
【解决方案2】:

您的if (($_FILES["file"]["size"] &lt; ($MaxAvatarPictureSize*1000000))) 行已将可接受的文件大小限制为$MaxAvatarPictureSize 兆字节。尽管您提供的代码中似乎没有设置$MaxAvatarPictureSize。我的猜测应该是最大 1 或 2。 $LastFilename 也未设置,可能还有其他一些。

还要在压缩部分周围放置if($UploadIsBad === false) { /* do zipping */ },以避免压缩过大或无效的文件。

【讨论】:

  • 而且 $_FILES["file"]["size"] 不能是假的吗?注入一些代码?我不知道,我不是 sec 专家,但我应该成为,我正在开发软件......
  • 他还不如使用upload_max_filesize,因为这样可以避免 PHP 处理臃肿的请求。 (尽管带有非用户友好的消息。)
  • 额外的检查是调用filesize($_FILES["file"]["tmp_name"]) 来检查实际大小,而不是像@RowMinds 所说的那样依赖$_FILES["file"]["size"]
猜你喜欢
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多