停止嗅探MIME Type 默认启用

原文链接

简介:noSniff中间件阻止浏览器猜测(嗅探)MIME Type,以排除安全隐患。它的工作原理是将X-Content-Type-Options报头设置为nosniff

攻击方式

MIME Type 用于确定您正在查看的文件类型的方法。PNG图像是image/png; JSON文件是application/json;JavaScript文件是text/javascript。当浏览器加载文件时。它通过读取服务端的Content-Type报头来决定文件的类型。

当你的浏览器看到下面这段代码时:

<script src="https://example.com/my-javascript"></script>
1

它会从example.com加载my-javascript。如果example.com带有了值为text/javascriptContent-Type报头,那么你的浏览器会按照JavaScript来执行my-javascript的内容。

那么如果设置Content-Type: text/heml会怎么样?如果您的浏览器执行了所谓的“MIME Type 嗅探”策略(有些人是这么做的),它将查看文件的内容,判断它是否是JavaScript,如果是,则执行它。这意味着服务器可以发送错误的Content-Type,但JavaScript仍然可以执行。

那么MIME Type嗅探就成了一个攻击维度。用户可以上传扩展名为.jpg的图片,但其实际内容是HTML。查看该图像可能导致浏览器“运行”HTML页面,这可能会包含恶意的JavaScirpt代码。最糟糕的要数Rosetta Flash攻击了,它是让您的页面加载恶意Flash插件而不是数据。

扩展阅读:

报头详解

X-Content-Type-Options报头告诉浏览器是否嗅探MIME Types。当其被设置为nosniff时,浏览器将不会进行嗅探——它们会相信服务器所说并在资源出错时进行阻止。

扩展阅读:

代码

noSniff中间件将把每个请求的X-Content-Type-Options报头的值设置为nosniff

您可以作为Helmet的内部模块来使用:

// Make sure you run "npm install helmet" to get the Helmet package.
const helmet = require('helmet')

// Sets "X-Content-Type-Options: nosniff".
app.use(helmet.noSniff())
1
2
3
4
5

也可单独使用:

// Make sure you run "npm install dont-sniff-mimetype" to get this package.
const noSniff = require('dont-sniff-mimetype')

// Sets "X-Content-Type-Options: nosniff".
app.use(noSniff())
1
2
3
4
5
上次更新: 1/19/2020, 5:49:54 PM