本站底部调用了ip.sb的API以显示访客IP,突然某一天不能显示了。本以为是now.sh的hugo部署问题。闲暇时分析一下才明白是CORB问题。

什么是CORB?

全称为 Cross-Origin Read Blocking,跨域读取阻止。旨在为可疑的跨域资源负载可能会在网络浏览器到达网页之前被识别并阻止。

ip.sb 存在的问题与修复方案

(通过沟通,已经修复。)问题出现在jsonp的调用方式上

<script>
function getip(json){
    document.write("My IP address is: ", json.ip);
}
</script>
<script type="application/javascript" src="https://api.ip.sb/jsonip?callback=getip"></script> 

如上,jsonp方式通过<script>标签对api进行调用。一切看起来是正常的。而https://api.ip.sb/jsonip?callback=getip 的头部包含了参数X-Content-Type-Options: nosniff并且返回的Content-Type字段值为application/json;charset=UTF-8

nosniff头的作用为:

下面两种情况的请求将被阻止:

  • 请求类型是"style” 但是 MIME 类型不是 “text/css”,
  • 请求类型是"script” 但是 MIME 类型不是 JavaScript MIME 类型

所以此处ip.sb返回的数据会被浏览器拦截。而修复方案也很简单。

  1. 去掉头部返回的 x-content-type-options: nosniff 参数

  2. 将 content-type 返回的参数改为javascript类型,例如Content-Type: text/javascript;charset=UTF-8

CORB与XSS

有很多脆弱的站点允许用户托管任意文本文件。就容易造成滥用。比如XSS攻击时多使用<script><style>标签引用,就容易被当作JS脚本远程调用,这是平台运营者不希望发生的。运营方就可以通过设置nosniff头与设置返回的content-type来对滥用进行限制。比如github(raw.githubusercontent.com域下资源)与gitee(https://gitee.com/xxx/raw/ 下资源)都用此手段来进行防止滥用。

ref:

https://chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-Content-Type-Options