【问题标题】:Javascript - Upload file content type validationJavascript - 上传文件内容类型验证
【发布时间】:2012-07-31 04:25:12
【问题描述】:

如何在使用 JavaScript 上传之前验证文件的内容类型? 我不是在询问扩展验证。我想验证 pdf、纯文本和 MS word 文件。

我正在使用 django forms.ModelForm 将文件上传小部件传递给 html。我在服务器端也无法做到这一点。这是那个问题,

Django - Uploaded file type validation

【问题讨论】:

  • 您是在问如何识别客户端上的文件类型 - 在发送到服务器之前?
  • 是的,但我知道扩展验证。

标签: javascript python django validation file-upload


【解决方案1】:

理论上您可以使用File API 来读取文件。

然后,您需要用 JavaScript 为您关心的文件格式编写解析器,以检查它们是否匹配。

【讨论】:

  • 注意:你不必解析文件;如果你有一个 File 对象,你可以读取它的 type 属性:developer.mozilla.org/en/Using_files_from_web_applications 也就是说,File API 是 HTML 5 并且正在进行中。
  • @AaronDigulla — 这需要信任浏览器才能正确确定文件类型。我希望浏览器会要求底层操作系统和 Windows(至少)使用文件扩展名。
  • @Quentin:即使您尝试解析文件,攻击者也可以通过使用命令行工具上传来轻松绕过这一点。所以无论你怎么做,它都会是一个薄弱的防御,这会导致你应该花多少精力在上面的问题。
  • @AaronDigulla — 请参阅我对您的回答的第一条评论。
【解决方案2】:

也许可以,但它不会为您提供任何形式的安全性,因为攻击者可以使用其他方式上传文件从而绕过您的验证。

要使用扩展名检查文件类型(这是非常不安全的,因为它很容易操作),您可以使用 JavaScript。看到这个问题:How do I Validate the File Type of a File Upload?

[编辑] 在googling 之后,我发现input 元素有一个属性accept,它采用一系列mime 类型模式。不幸的是,大多数浏览器都会忽略它(或仅使用它来调整文件选择对话框)。看到这个问题:File input 'accept' attribute - is it useful?

[编辑 2] 现在,如果您真的不想使用文件扩展名,文件 API(请参阅“Using files from web applications”)似乎是您唯一的方法。每个File 实例都有一个type 属性,其中包含mime 类型。

但此 API 正在开发中,因此并非在任何地方都可用。并且不能保证你会得到一个 MIME 类型(属性可以是"")。

所以我建议采用这种方法:试试 File API。如果它不可用或type 属性为空,请使用文件扩展名。

【讨论】:

  • 大概和所有客户端验证一样,目的不是为了安全,而是为了避免用户上传(可能是大文件)而被拒绝。
  • 该问题明确拒绝文件扩展名检查。
  • IIRC,accept 属性的实现通常基于文件扩展名。
  • 1.如果不使用文件扩展名,似乎没有办法做到这一点。 2. 服务器可以读取文件的前几KB,分析它们并拒绝它们(关闭通道)。大多数服务器框架不支持开箱即用,但这是可能的。
猜你喜欢
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 2012-07-29
  • 2016-01-25
  • 1970-01-01
  • 2013-12-14
  • 2016-01-18
  • 1970-01-01
相关资源
最近更新 更多