乐趣区

关于加密:密码学系列之内容嗅探

简介

内容嗅探,也被称为媒体类型嗅探或 MIME 嗅探,是查看一个字节流的内容,试图推断其中数据的文件格式的做法。内容嗅探通常用在媒体类型没有被精确指定的状况,用于弥补元数据信息。

本文将会解说内容嗅探的罕用场景和可能呈现的问题。

MIME types

MIME 的全称是 Multipurpose Internet Mail Extensions,多用途互联网邮件扩大。它是一种规范,它表明了文档、文件或各种字节的性质和格局。它是在 IETF 的 RFC 6838 中定义的。互联网编号调配机构(IANA) 负责定义所有官网的 MIME 类型。

MIME 的构造蕴含两局部,别离是 type 和 subtype, 他们以 / 来进行宰割:

type/subtype

类型代表数据类型所属的个别类别,如视频或文本。子类型确定 MIME 类型所代表的指定类型的确切数据品种。例如,对于 MIME 类型的文本,子类型可能是 plain(纯文本)、html(HTML 源代码)或日历(对于 iCalendar/.ics)文件。

每种类型都有它本人的一套可能的子类型, 一个 MIME 类型必须蕴含一个类型和一个子类型。

还能够在前面加上额定的参数:

type/subtype;parameter=value

例如,对于主类型是 text 的任何 MIME 类型,可选的 charset 参数能够用来指定数据中字符的字符集。如果没有指定字符集,默认为 ASCII (US-ASCII),除非被用户代理的设置笼罩。要指定 UTF- 8 文本文件,则应用 MIME 类型 text/plain;charset=UTF-8。

MIME 类型不辨别大小写,但传统上用小写,但参数值除外,因为参数值的大小写可能有或没有特定的意义。

MIME 有两中类型,别离是discretemultipart

离散类型是代表繁多文件或媒介的类型,如繁多文本或音乐文件,或繁多视频。

多局部类型是指由多个组件组成的文件,每个组件都有本人独立的 MIME 类型;或者,指封装在一个事务中一起发送的多个文件。例如,电子邮件中多个附件就是一种多局部 MIME 类型。

咱们看下常见的 discrete 类型:

  1. application,比方:application/octet-streamapplication/pdfapplication/pkcs8application/zip 等。
  2. audioList,比方:audio/mpegaudio/vorbis
  3. font,比方:font/wofffont/ttffont/otf
  4. image,比方:image/jpegimage/pngimage/svg+xml
  5. model,比方:model/3mfmodel/vml
  6. text,比方:text/plain, text/csvtext/html.
  7. video,比方:video/mp4

常见的 Multipart 类型如下:

  1. message,比方:message/rfc822message/partial
  2. multipartList,比方:multipart/form-data 和 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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!

退出移动版