内容嗅探,也被称为媒体类型嗅探或MIME嗅探,是检查一个字节流的内容,试图推断其中数据的文件格式的作法。内容嗅探一般用在媒体类型没有被准确指定的状况,用于补偿元数据信息。html
本文将会讲解内容嗅探的经常使用场景和可能出现的问题。算法
MIME的全称是Multipurpose Internet Mail Extensions,多用途互联网邮件扩展。它是一种标准,它代表了文档、文件或各类字节的性质和格式。它是在IETF的RFC 6838中定义的。互联网编号分配机构(IANA)负责定义全部官方的MIME类型。浏览器
MIME的结构包含两部分,分别是type和subtype,他们以 / 来进行分割:安全
type/subtype
类型表明数据类型所属的通常类别,如视频或文本。子类型肯定MIME类型所表明的指定类型的确切数据种类。例如,对于 MIME 类型的文本,子类型多是 plain(纯文本)、html(HTML 源代码)或日历(对于 iCalendar/.ics)文件。服务器
每种类型都有它本身的一套可能的子类型, 一个MIME类型必须包含一个类型和一个子类型。app
还能够在后面加上额外的参数:ide
type/subtype;parameter=value
例如,对于主类型是text的任何MIME类型,可选的charset参数能够用来指定数据中字符的字符集。若是没有指定字符集,默认为ASCII (US-ASCII),除非被用户代理的设置覆盖。要指定UTF-8文本文件,则使用MIME类型text/plain;charset=UTF-8。svg
MIME类型不区分大小写,但传统上用小写,但参数值除外,由于参数值的大小写可能有或没有特定的意义。网站
MIME有两中类型,分别是discrete 和multipart。代理
离散类型是表明单一文件或媒介的类型,如单一文本或音乐文件,或单一视频。
多部分类型是指由多个组件组成的文件,每一个组件都有本身独立的MIME类型;或者,指封装在一个事务中一块儿发送的多个文件。例如,电子邮件中多个附件就是一种多部分MIME类型。
咱们看下常见的discrete类型:
application/octet-stream
,application/pdf
,application/pkcs8
和application/zip
等。audio/mpeg
,audio/vorbis
。font/woff
,font/ttf
和font/otf
。image/jpeg
,image/png
和image/svg+xml
。model/3mf
和model/vml
。text/plain
, text/csv
和 text/html
.video/mp4
。常见的Multipart类型以下:
message/rfc822
和message/partial
。multipart/byteranges
。由于浏览器使用MIME类型,而不是文件扩展名来决定如何处理一个URL,因此Web服务器在响应的Content-Type头中发送正确的MIME类型很是重要。若是没有正确配置,浏览器极可能会误解文件的内容,网站将没法正常运行,下载的文件也可能会被错误处理。
为了解决这个问题,或者说是更好的用户体验,不少浏览器会进行MIME内容嗅探,也就是经过解析文件的内容,来猜想MIME类型的格式。
不一样的浏览器处理MIME嗅探的方式是不同的。可是他们均可能会产生严重的安全漏洞,由于有些MIME类型是可执行类型的,恶意攻击者能够经过混淆MIME嗅探算法,从而使攻击者能够进行网站运营者或用户都没有预料到的操做,如跨站脚本攻击。
若是不想浏览器端进行嗅探,能够在服务端的响应中设置 X-Content-Type-Options
头,好比:
X-Content-Type-Options: nosniff
这个头最先是在IE 8中支持的,不过如今全部的浏览器基本都支持这个head类型了。
咱们一般须要在JS中判断浏览器是不是IE浏览器,而后作响应的处理:
var isIEBrowser = false; if (window.ActiveXObject) { isIEBrowser = true; } // Or, shorter: var isIE = (window.ActiveXObject !== undefined);
上面的例子就是很是简单的客户端嗅探,经过判断window是否有ActiveXObject 这个属性来肯定这个浏览器是不是IE浏览器。
本文已收录于 http://www.flydean.com/content-sniffing/最通俗的解读,最深入的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注个人公众号:「程序那些事」,懂技术,更懂你!