我的服务器上有一些非常敏感的信息,因此安全性是个大问题。用户需要能够上传视频。我知道允许用户上传文件会带来安全威胁,因为没有100%的方法可以阻止他们上传非视频。但我显然可以选择服务器将保留哪些文件。
我知道检查文件扩展名是不够的。检查MIME类型更好,但它仍然可以伪造。那么我该如何检查文件是否是视频?
答案 0 :(得分:9)
玩吧!
唯一可以确定的方法是使用一些代码来解码相关类型的视频,看看它(并检查是否有明智的结果,如非零持续时间)。
否则,您的风险很低:
非恶意场景:
恶意方案1:
恶意方案2:
有关方案2的三点注意事项:
总而言之,只需确保只输出您接受的内容类型,并强制文件扩展名匹配它们;如果用户上传名为hahaha.exe的视频/ mpeg,则将其重命名为hahaha.mpg
编辑:哦,还有:
恶意方案3:
上传者以一种使用大量资源的方式上传利用某些玩家的视频。在这种情况下,下载器只会杀死-9 / ctrl-alt-delete /你的操作系统 - 杀死他们所有选择,但如果你的服务器测试它是一个视频,那么它可能会遇到麻烦,因为它有没有人可以介入并杀死200(并且随着剧本小子的剧本不断上传而不断上传)“视频”正试图解释。
正常进行正常的视频处理可能足以向你介绍DoS的能力(毕竟视频处理相对较重),因此测试文件可能会带来比你节省更多的危险。
答案 1 :(得分:2)
用户可以安全地上传任何内容,只要它到达正确的目录并且服务器上没有任何东西试图运行它(如果它应该是视频,那么什么都不会尝试)。除非受害者以某种方式激活它,否则恶意软件无法做任何事情。
答案 2 :(得分:2)
您可以通过php扩展程序调用{{1}}:
https://github.com/char0n/ffmpeg-php/
它基本上包装了ffmpeg
的输出,然后您可以在php中检查。但是,您应首先使用ffmpeg来熟悉自己,这本身就是一个完整的主题。如果您不想使用该库,可以通过exec自行执行ffmpeg。
另外,我会检查mimetype。您还可以通过JS检查文件输入中的客户端文件(不是在所有浏览器中,这是没有替代真正的验证)。
LG,
FLO
答案 3 :(得分:0)
我同意,除非视频播放器存在可以通过某些损坏的视频文件利用的问题,否则我不会太担心。但是,不一定要出于安全原因,必须检查您拥有的文件是否是视频文件,并且所有文件都有效,您可以执行以下步骤
现在理论上可能一个文件包含每个帧的所有有效标题但数据错误但没有解码实际内容并在播放器上查看它这是你可以做的最好的事情。而且我会说这很好,而且速度非常快。