繁体   English   中英

确定Web服务器返回的文件类型的正确方法是什么?

[英]What is the correct way to determine the type of a file returned by a web server?

我一直认为HTTP Content-Type应该正确地标识返回资源的内容。 我最近注意到google.com上的资源,其文件名类似于/extern_chrome/799678fbd1a8a52d.js,其中包含以下HTTP标头:

HTTP/1.1 200 OK
Expires: Mon, 05 Sep 2011 00:00:00 GMT
Last-Modified: Mon, 07 Sep 2009 00:00:00 GMT
Content-Type: text/html; charset=UTF-8
Date: Tue, 07 Sep 2010 04:30:09 GMT
Server: gws
Cache-Control: private, x-gzip-ok=""
X-XSS-Protection: 1; mode=block
Content-Length: 19933

内容不是HTML,而是纯JavaScript。 当我使用本地代理(Burp Suite)加载资源时,该代理指出MIME类型为“脚本”。

是否存在确定Web服务器返回内容的可接受方法? Content-type标头似乎通常是正确的。 扩展名也是一个指标,但并不总是准确的。 是检查文件内容的唯一准确方法吗? Web浏览器是用来确定如何处理内容的吗?

是检查文件内容的唯一准确方法吗?

浏览器用来确定文件类型的方法,但绝不是准确的。 它不准确的事实是出于安全考虑。

服务器指示文件类型的唯一方法是通过Content-Type HTTP标头。 不幸的是,过去,很少有服务器为此标头设置正确的值。 因此,浏览器决定玩得更聪明,并尝试使用自己的专有算法找出文件类型。

浏览器完成的“猜测工作”称为内容嗅探。 了解内容嗅探的最佳资源是浏览器安全手册 另一个伟大的资源是本论文 ,他的建议,现在已经被纳入谷歌Chrome和IE8。

如何确定正确的文件类型?

如果您只是在处理服务器的已知列表/小型列表,只需要求它们设置正确的内容类型标头并使用它即可。 但是,如果您要处理无法控制的狂野网站,则可能必须开发某种内容嗅探算法。

浏览器知道它是JavaScript,因为它是通过<script src="...">标记到达的。

如果您在URL的地址栏中键入.js文件的URL,则即使服务器确实返回了正确的Content-Type,您的浏览器也不会将文件视为要执行的JavaScript。 (相反,根据您的浏览器,您可能会在浏览器窗口中看到.js源代码,或者提示您将其保存为文件。)

除非被<script>标记(简单而简单地)引用,否则浏览器不会对JavaScript进行任何操作。 不需要内容嗅探。

对于JavaScript,CSS和HTML等文本文件,浏览器将尝试解析该文件。 如果在任何内容都无法解析之前解析失败,则认为它完全无效。 否则,将尽可能保留和使用。 对于JavaScript,可能需要在语法上编译所有内容。

对于Flash,PNG,JPEG,WAVE等二进制文件,它们可以使用诸如magic库之类的库 魔术库使用文件的内容确定文件的MIME类型,这实际上是唯一值得信赖的部分。

但是,以某种方式,当您在浏览器中拖放文档时,这种情况下的浏览器启发式方法是检查文件扩展名。 真弱! 因此,附加到POST的文件可能是.exe,您会认为它是.png,因为这是当前的文件扩展名...

我有一些代码可以在JavaScript中测试文件的MIME类型(在拖放或浏览后):

https://sourceforge.net/p/snapcpp/code/ci/master/tree/snapwebsites/plugins/output/output.js

搜索MIME,您会发现完成这项工作的各种功能。 在编辑器中可以看到用法示例:

https://sourceforge.net/p/snapcpp/code/ci/master/tree/snapwebsites/plugins/editor/editor.js

在mimetype插件中可以找到基本MIME类型的扩展。

所有这些都是面向对象的代码,因此一开始可能很难理解,但是或多或少地,许多调用是异步的。

是否存在确定Web服务器返回内容的可接受方法? Content-type标头似乎通常是正确的。 扩展名也是一个指标,但并不总是准确的。

据我所知,Apache使用文件扩展名。 假设您信任您的网站管理员,并且最终用户无法上传内容,则扩展名实际上是相当安全的。

是检查文件内容的唯一准确方法吗?

准确,安全,是的。 就是说,利用数据库系统的服务器可以将这样的元数据保存在数据库中,因此不必每次处理文件时都进行重新检查。 此外,一旦检测到类型,它可以尝试进行加载以再次检查MIME类型是否正确。 这甚至可以在后端过程中发生,因此您不会浪费客户端的时间(实际上,我的服务器会走得更远,并且还会检查每个文件是否包含病毒,因此即使无法加载它的文件也会以某种方式被检查。)

Web浏览器是用来确定如何处理内容的吗?

正如乔·怀特(Joe White)提到的,在大多数情况下,浏览器期望文件中包含特定类型的数据:CSS链接期望CSS数据; 脚本需要JavaScript,Ruby,ASP; 图片或图形标签需要图片; 等等

因此,浏览器可以将加载程序用于该类型的数据,如果加载失败,它将知道它的类型不正确。 因此,浏览器本身并不需要真正检测类型。 但是,您必须相信,当数据流无效时,加载程序将正确失败。 这就是为什么我们要更新Flash播放器,而回溯时要更新GIF库。

就像魔术库一样,对类型的检测仅会在文件的开头读取“几个”字节,并根据该字节确定类型。 这并不意味着该文件有效并且可以安全地加载。 GIF错误意味着该文件看上去非常像一个GIF图像(它具有正确的签名),但是在某些时候,库中使用的缓冲区可能会溢出,可能会导致浏览器崩溃的方式,并希望对黑客有帮助。你的电脑...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM