php - 如何验证上传的文件是视频?

标签 php php-5.3

我有一台服务器,上面有一些非常敏感的信息,所以安全是个大问题。用户需要能够上传视频。我知道允许用户上传文件会带来安全威胁,因为没有 100% 的方法可以阻止他们上传非视频。但我显然可以选择服务器保留哪些文件。

我知道检查文件扩展名是不够的。检查 MIME 类型更好,但它仍然可以被伪造。那么我该如何检查文件是否是视频呢?

最佳答案

玩吧!

唯一可以确定的方法是使用一些代码来解码相关类型的视频,看看它(并检查是否有合理的结果,例如非零持续时间)。

否则,您的风险很低:

非恶意场景:

  1. 上传者上传视频,内容类型为 video/*。
  2. 您存储八位字节和内容类型。
  3. 下载器下载视频,您使用收到的内容类型。
  4. 下载者观看视频(或提示编解码器等)

恶意场景 1:

  1. 上传者上传了一个恶意木马,内容类型为 video/*。
  2. 您存储八位字节和内容类型。
  3. 下载器下载恶意木马,您使用收到的内容类型。
  4. 下载器会在视频播放器中打开恶意木马。 Nasty trojan 什么都不做,因为它不是视频。用户提示编解码器。更糟糕的情况是,他们在 ubuntu 论坛上大骂不支持专有格式,在您的页面上添加拼写错误的评论,说该网站有多糟糕,因为视频无法播放,等等。

恶意场景 2:

  1. 上传者上传恶意木马,该木马被写入视频,利用流行视频播放器的缓冲区溢出问题。
  2. 你存储...
  3. 下载器...
  4. 可能就像上面的其中一个一样,但也可能是他们受到了攻击(如果他们使用的是受影响的播放器)。

不过,关于场景 2,需要注意三件事:

  1. 测试它是一个视频并不能保证安全,因为它很可能在某些播放器中也能正常工作。
  2. 如果漏洞存在于 ffmpeg 中,测试视频可能会使您的服务器容易受到攻击!
  3. 这种类型的利用既罕见又难以实现。一般风险与上传和下载 jpeg 或 png 相同。事实上,它有点小(确实有一段时间这种类型的漏洞影响了常用的 jpeg 库)。

总而言之,只要确保你只输出你接受的内容类型,并强制文件扩展名匹配它们;如果用户上传了一个名为 haha​​ha.exe 的视频/mpeg,则将其重命名为 haha​​ha.mpg

编辑:哦,还有:

恶意场景 3:

上传者上传的视频会以占用大量资源的方式利用某些玩家。在这种情况下,下载器只会 kill-9/ctrl-alt-delete/your-OSs-kill-them-all-of-choice,但如果你的服务器正在测试它是一个视频,那么它可能会遇到麻烦,因为没有人介入并杀死它试图解释的 200 个(并且随着脚本小子的脚本不断上传更多)“视频”。

仅仅进行正常的视频处理就足以向您引入 DoS 能力(毕竟视频处理相对繁重),因此测试该文件可能会带来更多的危险,而不是让您免于遭受的危险。

关于php - 如何验证上传的文件是视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11851016/

相关文章:

php - 如何用 PHP 执行多个 mysql 查询

forms - Symfony2 绑定(bind)请求错误

php - 基于selectbox ajax php mysql填充文本框

php - 在静态方法中访问类名的更短方法?

php - 添加日期(日期来自数据库),没有得到正确的答案

mysql - 如何优化包含连接和子查询的 sql 联合

php - 每个表单上的 Laravel 5.2 CSRF 字段?

php - Codeigniter 的数据库错误

Phpunit 基于 TestCase 从执行中排除测试

php - 使用 Simpletest 对 CodeIgniter 进行单元测试 - 很少的测试