【问题标题】:View/download PHP uploads - how to do it virus safe?查看/下载 PHP 上传 - 如何做到防病毒?
【发布时间】:2015-11-20 14:44:32
【问题描述】:

现在我已经阅读了一堆关于如何检查 PHP 上传是否是病毒安全的 SO 主题,其中的要点是:我不能 100% 保证上传中没有病毒 - 无论扩展名如何.一种建议的解决方案是在上传过程中删除扩展,然后在人们想要下载时重新组装。

但是,我想让用户直接在网站上查看文件。我该怎么做呢?例如,生成一个内含上传 PDF 的 iframe - 这是安全的还是像执行它一样会给潜在的病毒传播机会?对于 DOC,我想使用 Google Docs,所以我嵌入了一个 Google Docs 的 iframe,它在我的服务器上获取 DOC 的 URL。那这样安全吗?

或者除了只允许下载来防止潜在的病毒在服务器上传播之外,没有别的办法吗?如果是这样,如何重新组装扩展?我猜,当有人上传 test.exe 时,我会删除 .exe 部分但存储在数据库中。然后当有人请求下载时,我将测试文件重命名为 test.exe 并推送下载。之后,我将其重命名为测试。对吗?

另外:像 Trello 这样的服务是如何做到这一点的?当我在那里上传图像文件时,它会直接显示 - 不会因病毒扫描或其他原因而出现明显延迟。我考虑过使用 virustotal.com API,但这肯定需要很长时间,不是吗?是否可以让人们上传,然后在完成 virustotal.com 扫描并考虑文件安全之前不公开展示他们?

感谢和欢呼所有的帮助和抱歉,如果我错过了什么。

【问题讨论】:

  • 了解一件事...... 文件扩展名与任何事情都没有任何关系。除此之外,“清除”病毒文件的唯一方法是通过某种病毒扫描程序运行它。如果扫描仪发现某些内容,则拒绝该文件。如果您允许用户将文件保存在您的服务器上,那么这些文件实际上可以包含 anything。除非您以任何方式检查或修改这些文件,否则用户将完全下载上传的内容。
  • 没有。你不重命名文件,句号。他们在服务器上。他们不能伤害用户。您可以告诉客户端下载文件时的任何名称,例如header('Content-disposition: attachment; filename="cutekittens_with_virus.exe"); readfile('totally_different_filename');
  • 好吧,我肯定在这里完全混淆了一些东西。你是对的 - 重命名是防止文件在服务器上执行的建议解决方案,但它不会让用户免于病毒痛苦。所以总结一下:我让他们上传,我不会重命名,然后我不会公开展示任何东西,直到 virustotal.com 告诉我我很好 - 如果没有,我会立即删除文件.这些文件位于随机命名的文件夹中,因此用户不应该自己找到它们 - 只要文件没有被执行,我是否可以安全地假设我的服务器不会被注入?

标签: php security file-upload upload virus


【解决方案1】:

这些年来我在实践中看到了一些方法:

  1. 在本地扫描它,例如使用蛤蜊AV。
    • 专业人士:如果您的病毒检测是最新的,您可以通过这种方式捕获任何已知病毒。
    • 骗局:防病毒软件是一个攻击面。查看来自 Google Project Zero 的 Tavis Ormandy 的许多发现。
    • Con:可能会占用服务器资源。 (也许启动一个专门用于 AV 目的的不同服务器?)
  2. 使用 API,例如 VirusTotal。
    • 专业版:攻击面更小。
    • 缺点:您必须与 VirusTotal 共享文件,如果您让用户上传的文件特别敏感(即受保护的健康信息),这可能是个坏主意。

我不确定要推荐哪个,因为我不知道您的威胁模型或操作限制。

但是,不提供浏览器漏洞利用(例如 XSS)或允许服务器上的反向 shell 的更普遍问题实际上是 somewhat easy,但并非微不足道。

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 2010-11-26
    • 2010-10-13
    • 1970-01-01
    • 2011-07-25
    • 2012-03-27
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多