PHP |允许用户上传的安全性

时间:2015-02-20 16:44:58

标签: php security iis file-upload download

我的想法

我正在使用 PHP 创建一个Web应用程序,该应用程序允许用户扫描其文件中的病毒。它允许用户通过html"文件"上传文件。输入类型或通过URL。我已经成功构建了html和PHP方面的东西,用户可以成功地将文件上传到我的服务器上。我正在使用带有IIS的Windows Server 2012 R2作为我的网络服务器

我的问题:

据我所知,为了避免我网站上的安全/攻击漏洞,或者更糟糕的是,在服务器上自我保护,几乎没有安全措施(脚本和服务器端)。我知道攻击者可能会上传并执行可能破解我服务器的文件。 那么,我可以采取哪些措施来尝试消除这些问题

我意识到的事情:

由于我进行的研究,我的理解是我可以做以下事情以加强我的自我,但这些都是理论,我不知道如何实际把它们放到位(因此我为什么是问):

  • 对文件类型的限制(是的,我可以阻止.php文件,但作为示例 - 我无法阻止常见的.exe,因为用户很可能会扫描可执行文件)什么是这种服务的正确平衡,因为限制太多文件类型只会消除可用性

  • 将上传的文件存储在不同的驱动器中 - 我的站点目录位于C盘中,我有一个空的D盘我可以使用。 如何禁用服务器执行特定驱动器中的任何内容?如何阻止黑客导航到该驱动器并执行上传的文件?

我尝试过的事情:

  • 我创建了一个函数来重命名上传到它的md5哈希的文件,开头有一个唯一的ID,因此用户无法轻易识别该文件。
  • 要删除.php上传的有限文件类型?也许还有其他一些对我有用的东西?

结论:

基本上,以及上述小问题的答案。我正在寻找一系列我可以采取的措施来加强应用程序和服务器,以消除任何可能的威胁。感谢

代码:

作为旁注,下面你可以看到我的代码。以防你在那里发现任何严重的事情。或者有额外的安全性可以添加到代码中:

PHP:

$upload_directory = "uploads/";
    $uploaded_file = $upload_directory . basename($_FILES["file"]["name"]);
    $upload_ok = 1;

    $image_file_type = pathinfo($uploaded_file, PATHINFO_EXTENSION);

    // check for files bigger then 8mb
    if($_FILES["file"]["size"] > 8388608){
        print "your file exceeds 8mb";
        $upload_ok = 0;
        exit();
    }

    // only allow certain file types
    if($image_file_type != "jpg" && $image_file_type != "png" && $image_file_type != "jpeg" && $image_file_type != "gif"){
        print "invalid file type";
        $upload_ok = 0;
        exit();
    }

    // upload it
    if($upload_ok != 0){
        move_uploaded_file($_FILES["file"]["tmp_name"], $uploaded_file);
    }

HTML:

<form method="post" action="index.php" enctype="multipart/form-data">

    <label>Select Desired File</label><br>
    <input type="file" name="file" id="file">

    <input type="submit" name="submit" value="Scan File"> 
</form> 

此致

3 个答案:

答案 0 :(得分:1)

首先确保无法执行文件,因此只读/禁用脚本执行并确保无法通过Web访问它们。

确保上传的文件不是可能修改系统响应方式的特殊文件,例如web.config / .htaccess

重命名所有上传内容不信任原始名称,或接受任何可能允许上传者修改保存路径的参数。

答案 1 :(得分:0)

是否有理由需要将文件复制到上传目录?我不确定如何使用Windows服务器,但在Linux服务器上,上传的文件将被复制到Web根目录之外的临时目录中。

您仍然可以通过访问$ _FILES [“file”] [“tmp_name”]来打开文件,并对其执行任何启发式操作。这比将文件移动到Web根目录中的公共可访问目录更安全。

答案 2 :(得分:0)

首先,您必须意识到在您的服务器上允许病毒样本的风险很高。总是认为他们可以爆发。

首先,我的建议是在服务器上的虚拟机上执行实际分析。我知道这很可能是不可能的,但它仍然是最好的选择。小心将客户数据或生产资料保存在处理受感染可执行文件的服务器上。

之后:

  • 使用MIME类型检查文件类型,而不是文件扩展名。虽然这也可以伪造,但你必须在hexeditor中编辑二进制文件,例如..你可以使用:finfo。你也可以检查两个。
  • 要提高安全性,请不要直接访问上传的文件。如果您想允许这样的功能,那么可以使用PHP Handler来打印设置了content-disposition标志的文件。这样他们就无法在服务器上执行实际的PHP文件,因此您可以针对PHP Shell进行设置。
  • 限制来自Web服务器用户的写入/读取访问权限,我不是Windows管理员,所以我无法给出实际的提示。

我希望这会有所帮助。