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

2024-06-02

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

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


Play it!

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

但除此之外,您的风险很低:

非恶意场景:

  1. 上传者上传视频,内容类型为 video/*。
  2. 您存储八位位组和内容类型。
  3. 下载程序下载视频,然后您使用收到的内容类型。
  4. 下载者观看视频(或抱怨编解码器等)

恶意场景一:

  1. 上传者上传一个令人讨厌的木马,其内容类型为 video/*。
  2. 您存储八位位组和内容类型。
  3. 下载程序会下载令人讨厌的木马,然后您使用收到的内容类型。
  4. 下载程序会在视频播放器中打开令人讨厌的木马。讨厌的木马什么也不做,因为它不是视频。用户抱怨编解码器。更糟糕的情况是,他们在 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 攻击(毕竟视频处理相对繁重),因此测试文件可能会带来更多的危险,而不是为您避免的危险。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何验证上传的文件是视频? 的相关文章

  • 如何确定 n 高数字金字塔中的最大路线成本

    我有一个像这样的数字金字塔 7 4 8 1 8 9 2 4 6 7 4 6 7 4 9 4 9 7 3 8 8 routes 32 每个数字都按其系列中的强大程度进行索引 0 9 gt 1 1 8 gt 5 2 8 gt 4 3 7 gt
  • 返回变量在 PHP 中不起作用(即没有返回值!)

    我更喜欢使用 Python 语言进行编程 但必须使用 PHP 来处理特定的网站应用程序项目 在 PHP 中 我试图将函数中的值 返回 到主程序环境 用于后续计算 但无论我尝试什么 函数中计算的值都不会返回该值 而是从函数中回显 工作正常 在
  • 如何将 Filesystem 类的 glob 方法与 StorageFacade 结合使用?

    这涉及到拉拉维尔 5 我可以看到Illuminate Filesystem Filesystem一个方法叫做glob pattern flags 0 不幸的是 这个方法并没有体现在默认的情况下FilesystemAdapter随 Larav
  • 基于 PHP 的 CSV 编辑器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道用 PHP 编写的在线 CSV 编辑器允许用户打开 编辑和保存给定的 CSV 文件 我能找到的只
  • 在 symfony2 中为特定控制器设置 max_execution_time

    Using ini set 我可以扩展最大执行时间一个脚本的 在Symfony2 我可以添加ini set to web app php and web app dev php将增加的执行时间应用于所有控制器 但在这种情况下 我只想扩展最大
  • mongodb对话系统

    我正在实施一个verymongodb 上的简单对话系统 这个想法应该是 当我打开一个 convo 时 它应该显示发送和接收的消息 到目前为止一切正常 并且应该非常容易 通过使用像这样的伪代码这样的简单查询 from my id AND to
  • 如何在Web服务中传递URL

    我想将此 URL 作为网址中的值传递http localhost h2orn php verify php email emails hash hash但是 我只能在 符号之前传递 我想传递所有 URL 我正在使用java网络服务 代码在这
  • php 在内容前插入十六进制字符数

    我正在将网站移动到新服务器 旧服务器有 php 5 3 2 新服务器有 php 5 5 9 Centos httpd Apache 2 2 26 我已经复制了文件 它工作正常 除了唯一奇怪的事情 一些奇怪的十六进制数字被插入到页面内容之前
  • FPDF - 内嵌粗体文本

    我正在尝试从 PHP 创建 PDF 出于法律原因 我们需要将免责声明的一部分设为粗体 并且需要概述免责声明 我当前的代码使用 if isset POST optout POST optout yes pdf gt Ln 5 pdf gt S
  • 如何从字符串中只获取数字? [复制]

    这个问题在这里已经有答案了 我有这样的字符串 第 001 课 完成 在这种情况下 我只想获取数字部分001 我试过这个 str the title preg match all d str matches number implode ma
  • 一次将多个值插入MySQL [重复]

    这个问题在这里已经有答案了 谁能解释一下为什么这个 PHP MySQL 不起作用 基本上我需要从表单中一次插入大量行 因此会有多个名称字段 多个短 中 长字段等 我收到此错误 Notice Undefined variable Short1
  • 适用于 Windows 的 PHP 支持的 GUI 应用程序

    我知道 PHP 是一种解释性语言 对于基于 Web 的事物来说 不是为在实际操作系统上运行 GUI 应用程序而设计的 但是有没有办法呢 基本上 是否有一个框架 系统允许我创建 本机 基本上是二进制文件 exe 看起来像带有本机控件和所有内容
  • 如何在javascript中使用自动递增id?

  • SimpleSAMLPHP 重定向循环

    我们正在尝试使用自定义 mysql 数据库设置 sso 但它在以下两个请求之间进入无限循环 POST http 192 168 0 15 simplesaml module php core loginuserpass php 设置Cook
  • CSV 从 UTF8 到 ISO-8859-1

    我正在尝试修改我的 CSV 导出 但它不会将我的 CSV 从 UTF 8 转换 保存为 ISO 8859 1 请问我做错了什么吗 实际上自从修改了这个之后 我得到了一个空的 CSV 文件 php 7 0 x function my Gene
  • cURL '格式错误的网址'

    This url 在浏览器中工作得很好 但 cURL 返回错误 3 格式错误的 url 关于解决方法有什么想法吗 EDIT 卷曲代码 function get web page url options array CURLOPT RETUR
  • 将秒转换为天、小时、分钟和秒

    我想转换一个变量 uptime这是秒 分为天 小时 分钟和秒 Example uptime 1640467 结果应该是 18 days 23 hours 41 minutes 这可以通过以下方式实现DateTime http php net
  • 需要使用 php 从远程服务器下载与 $_FILES 相同的内容[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 好的 我有处理图像上传的 php 代
  • php,in_array,0值

    我试图理解in array下一个场景的行为 arr array 2 gt Bye 52 77 3 gt Hey var dump in array 0 arr 返回值in array 是布尔值true 正如你所看到的no值等于0 所以有人可
  • 从多个选择列表中插入数据到mysql数据库(html形式)

    我制作了一个表格 其中有商店的 ID

随机推荐

  • 如何将 PHP 与 yeoman Angular 项目集成

    我在用着yeoman questions tagged yeoman项目使用角js questions tagged angularjs通常我知道如何在普通项目中将 angularjs 与 PHP 结合使用 但我很困惑如何将 php 与 y
  • Kotlin 中扩展函数的多态性

    我有几个我无法控制的课程 我已经在几个常见的 属性 上创建了几个同名的扩展方法 名称相同的扩展函数始终返回相同的值类型 尽管针对每种类型的接收器以不同的方式计算 这里有一个简化的基于仅一个属性的内置类型的示例 DOES NOT COMPIL
  • 为什么WebApi绑定System.Version参数失败?

    UPDATE 解决了 这里没什么可看的 请继续 我有一个ApiController方法需要一个System Version范围 该参数以 JSON 形式在请求正文中传递 这是发送的内容 专业 0 未成年人 7 构建 0 修订 0 主要修订
  • 运行帆抛出无效字符错误

    我已经使用 npm install sails g 成功安装了 sails 我运行的是 Windows 7 当我尝试运行 sails 命令时 收到错误消息 找不到命令 然后我将相应的 bin 文件夹包含在 PATH 环境变量中 然后在尝试运
  • 调整 SwipeRefreshLayout 高度,将 View 置于其底部

    I have SwipeRefreshLayout里面一个RelativeLayout 问题是SwipeRefreshLayout占据了屏幕上的所有位置 我需要放置一个视图after这个观点 看图片 https i stack imgur
  • 使用 LINQ 更新 IEnumerable 对象的简单方法

    假设我有一个这样的业务对象 class Employee public string name public int id public string desgination public int grade List
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • 在给定索引上将字符串分成两部分并返回两部分

    我有一个字符串 需要在给定索引上拆分 然后返回两个部分 并用逗号分隔 例如 string 8211 8 211 98700 98 700 因此 我需要能够在任何给定索引上拆分字符串 然后返回字符串的两半 内置方法似乎执行分割 但只返回分割的
  • JIRA JQL 按日期搜索 - 有没有办法获取 Today()(日期)而不是 Now()(日期时间)

    我正在尝试在 JIRA 中基于以下内容创建一些问题过滤器CreateDate 我能找到的唯一日期 时间函数是Now 以及与之相关的搜索 即 1d 4d 等 唯一的问题是 Now 是特定于时间的 因此无法获取特定日期创建的问题 i e Cre
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 如何将路径添加到 Apache PATH 变量?

    我在 apache2 的 custom conf 文件中设置了以下内容 SetEnv PATH PATH opt local lib mysql5 bin this is a test 但是它不起作用 当我打电话时 hey shell ex
  • @fontface - 禅宗购物车中的 403 禁止错误

    我不确定这是否是发布此内容的正确位置 因为我不知道问题出在哪里 基本上 字体现在对我来说真的很痛苦 而且没有任何效果 我尝试从 google fonts 加载字体 但遇到了 IE 问题 所以我决定下载它们并自己提供服务 但现在它无法在任何浏
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • ID3和C4.5:“增益比”如何标准化“增益”?

    ID3算法使用 信息增益 度量 C4 5 使用 增益比 度量 即信息增益除以SplitInfo 然而SplitInfo对于记录在不同结果之间平均分配的分割 该值较高 否则较低 我的问题是 这如何帮助解决信息增益偏向于具有多种结果的分裂的问题
  • Angular 2 和使用 html 5 视频实例化相机流

    我是 Angular 2 的新手 如果我有一个视频标签 例如
  • NSSortDescriptor 和多对多关系

    我有两种反对意见 地点和历史项目 我正在尝试获取附加到任何历史记录项目的位置 因此该位置的获取谓词是 history count gt 0 效果很好 我还想使用 NSSortDescriptor 按最新历史项目的日期对位置对象进行排序 据我
  • 多线程——更快的方法?

    我有一堂有吸气剂的课程getInt 和一个二传手setInt 在某个领域 比如说领域 Integer Int 一个类的一个对象 比如说SomeClass The setInt 这里是同步的 getInt isn t 我正在更新的值Int来自
  • 如何在 Powershell 中自动对提示回答“是”?

    如何在 PowerShell 会话中输入 是 作为交互式问题的答案 我知道 在 Bash 中 Yes是在提示上回答 是 的工具 在我的情况下 我无法抑制提示 我正在运行的脚本停止于 如果您想继续 请回复 是 powershell 如何运行脚
  • 如何通过主机从外部 SSH 到 VirtualBox 来宾? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个在 Windows 7 计算机上运行的 Ubuntu 虚拟机 如何设置才能通过 SSH 从外部访问 Web 服务器 我找到了步骤
  • 如何验证上传的文件是视频?

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