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


PHP | Security for allowing user uploads

我的位置:

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

我的问题:

据我所知,几乎没有安全措施(脚本和服务器端)来避免我的网站上的安全/攻击漏洞,甚至更糟的是,服务器本身的安全/进攻漏洞。我知道攻击者可能会上传并执行文件,从而攻击我的服务器那么,我可以采取哪些步骤来尝试消除这些问题

我知道的事情:

由于我所做的研究,据我所知,我可能会做以下事情来增强我的自我,但这些都是理论,我不知道如何真正把它们落实到位(因此我为什么要问):

  • 对文件类型的限制(是的,我可能会阻止.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> 

问候

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

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

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

是否有原因需要将文件复制到上传目录?我不确定如何使用Windows服务器,但在linux服务器上,上传的文件会复制到web根目录之外的临时目录中。

您仍然可以通过访问$_FILES["file"]["tmp_name"]来打开该文件,并对此执行任何试探。这将比将文件移动到web根目录中的可公开访问的目录更安全。

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

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

之后:

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

我希望这能有所帮助。