【发布时间】: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