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