最近 Bootstrap 4 已经正式发布了,可能已经有爱尝鲜的小伙伴在 alpha 阶段就尝试过 BS4。不过今天要说的不是 BS4,而是官网里引入 BS4 框架依赖的 jQuery 的代码:

crossorigin="anonymous">

看起来比以前的写法复杂好多的样子。先不着急慢慢看,多了一个 integrity 属性,看值的样子就知道是用来验证文件完整性的。另外还有一个 crossorigin 属性……怎么?直接通过 script 标签加载网站外 JS 资源也要开始考虑跨域的问题了吗?

这里不讨论

不知道大家对此新属性的感觉如何,我的第一感觉是:新加了这么一个属性,难道以前不用 crossorigin 属性的时候,会出什么问题吗?到底可能会出什么问题呢?

从谷歌的结果来看,比较一致的说法是,当引入跨域的脚本(比如用了 apis.google.com 上的库文件)时,如果这个脚本有错误,因为浏览器的限制(根本原因是协议的规定),是拿不到错误信息的。当本地尝试使用 window.onerror 去记录脚本的错误时,跨域脚本的错误只会返回 Script error。

而 HTML5 新的规定,是可以允许本地获取到跨域脚本的错误信息的,但有两个条件:一是跨域脚本的服务器必须通过 Access-Control-Allow-Origin 头信息允许当前域名可以获取错误信息,二是网页里的 script 标签也必须指明 src 属性指定的地址是支持跨域的地址,也就是 crossorigin 属性。有了这两个条件,就可以获取跨域脚本的错误信息:

但事情还是不够明朗,看起来跨域脚本报个错也没什么啊,为什么浏览器(准确说是 HTTP 协议)这么轴,非要规定默认情况页面是不能获取跨域脚本错误信息的呢?

这其实跟网络安全有关,不妨举一个例子来说明。

我们先假设浏览器默认可以将跨域脚本的错误信息返回。

这个时候我在我的博客里写下如下代码:

...

注意 src 里面提到地址,都是 HTML 页面的地址,当成 JS 来执行,肯定是会报错的。

因为我们假设浏览器能报具体错误,这个错误可能是类似于:

“请登录” is undefined.

“您好” is undefined.

我们通过报错信息的不一致,可能可以推断出当前访问我博客的会员在某某银行是否有账号。虽然不是什么大问题,但隐私的确是泄漏了,如果我是攻击者我可能会通过判断会员在某家银行是否有账号,『精准』推送相关的钓鱼网站给他。

说清楚了来龙去脉,我们就可以更好的判断,我们是否真的需要给 script 标签加上 crossorigin 属性了。另外除了 script,所有能引入跨域资源的标签包括 link 和 img 之类,都有一样的属性。

2020-04-10 补充:需要注意的是,

2020-08-20 补充:关于 / 的 crossorigin 属性解释,见此篇文章。

2019-02-03 补充:因评论有提到为什么本地文件无法使用 crossorigin 和 integrity 这两个参数,我觉得有必要提一下这两个参数出现的理由和使用范围。

crossorigin 上面已经解释过了使用理由了,听名字也知道是跨域的时候用的属性,加载本地静态文件根本就不牵涉跨域的问题,所以本地就不应该用它(理论上使用也没关系,但浏览器就是这么定的,印象中如果 crossorigin 用在了本地文件上,浏览器报错信息会告诉你 crossorigin 只能支持 http/https/… 等协议上)。

而关于 integrity,其实文中提到的 MDN 文档也解释的很清楚:

Using Content Delivery Networks (CDNs) to host files such as scripts and stylesheets that are shared among multiple sites can improve site performance and conserve bandwidth. However, using CDNs also comes with a risk, in that if an attacker gains control of a CDN, the attacker can inject arbitrary malicious content into files on the CDN (or replace the files completely) and thus can also potentially attack all sites that fetch files from that CDN.

不知道大家有没有注意到文中反复出现的 CDN,如果注意到也大概能猜到 integrity (大部分情况)是给 CDN 的静态文件使用的,比如大名鼎鼎的 ajax.googleapis.com,或者国内的 cdn.bootcss.com。上面文字大概意思是说,CDN 虽好,但 CDN 有可能被劫持,导致下载的文件是被篡改过的(比如通过 DNS 劫持),有了 integrity 就可以检查文件是否是原版。但因为本地文件用的域名跟网页是同一个域名,不存在劫持的问题(或者劫持就连网站本身一起被劫持了,那就不是 integrity 能解决的问题了),所以本地静态文件没有太大必要用这个属性。

如果你自己搭了一套提供静态文件的独立站点,这个时候用 integrity 就有意义了。MDN 文档里也提到了 integrity 值的生成方式,这里也再引用一下:

cat FILENAME.js | openssl dgst -sha384 -binary | openssl base64 -A

或者

shasum -b -a 384 FILENAME.js | awk '{ print $1 }' | xxd -r -p | base64

总之简单一句话:只有当你的网页域名和要载入的静态文件存放的站点域名不一样的时候,使用这两个属性才有意义(并且因浏览器的规定 crossorigin 属性只有这个时候才能正常使用)。

写作累,服务器也越来越贵

求分担,祝愿好人一生平安

天使打赏人

html里面的crossorigin属性,HTML5 标签里的 crossorigin 属性到底有什么用? | Chrisyue's Blog...相关推荐

  1. HTML5 标签、事件句柄属性以及浏览器兼容情况速查手册

    随着主流浏览器对 HTML5 的不断支持和完善,越来越多的开发者开始使用 HTML5 来开发各种功能强大的 Web 应用程序,HTML5 正引领互联网新革命.为了方便大家更好的学习 HTML5,今天这 ...

  2. html.textboxfor属性,label标签中的for属性与form属性

    HTML中的label标签是干什么的?在讲这个标签之前先来做一个示范,请点击以下的文本框控件: 你的姓名是: 大家都知道上面的文本框使用的是input元素,当鼠标点击文本框时就能输入文本,若是点击文本 ...

  3. HTML5中拖动功能的添加属性,html5中可拖动dragable属性及其他成员的讲解

    html5中可拖动dragable属性及其他成员的讲解 发布时间:2020-04-22 11:08:02 来源:亿速云 阅读:350 作者:小新 这篇文章主要为大家详细介绍了html5中可拖动drag ...

  4. html picture属性,html5图片 srcset、sizes 属性和 picture 元素

    前言 关于图片img的响应属性srcset,和sizes及picture,很久之前看过,但是因为浏览器兼容原因,一直没有在项目中使用,但是最近发现,这几个属性兼容性还可以了,可以去caniuse中看一 ...

  5. 关于Java里面的String.getBytes()方法

    关于Java里面的String.getBytes()方法 Java里面的String类型的编码方式是Unicode,根据你项目字符串的编码方式无关,这是写死的.但是如果你jvm平台使用的是GBK编码方 ...

  6. html5不支持的属性,HTML5 常用语法一览(列举不支持的属性)

    HTML头部标记 标记 描述 HTML5标准 定义页面中所有链接的基准URL 设定显示在浏览器左上方的标题内容 表明该文档是一个可用于检索的网关脚本 不支持 文档本身的元信息,例如查询关键词,有效期等 ...

  7. dede文章调用时过滤调 body里面的style属性和值

    dede 发布文章的时候会在里面的标签中添加一些style 属性,现在改网站想去掉这些属性和里面的值,因为文章太多所以就用下面的方法 \include\arc.listview.class.php 在 ...

  8. html 里面的 role 属性是什么意思

    role="button" role是什么意思? html 里面的 role 属性是什么意义和用途 使用role属性告诉辅助设备(如屏幕阅读器)这个元素所扮演的角色,属于WAI-A ...

  9. servlet里面的context,定义属性值的事情!

    servlet里面的context,定义属性值. 在尚未指定属性值的时候.不管谁调用,都是NULL. 但是,一旦指定了属性值.那么,再次调用就是之间指定的数值啦! 而且,是象mapping一样存储对象 ...

最新文章

  1. 使用hyperopt(Bayesian optimization)为xgboost模型挑选最优参数进行模型构建、by Cross Validation
  2. innodb参数汇总
  3. 【Scratch】青少年蓝桥杯_每日一题_2.13_碰苹果
  4. MFC模块状态(一)
  5. QT乱码总结3.UNICODE有无BOM
  6. 开源 免费 java CMS - FreeCMS1.3-数据对象-mail
  7. python快速排序函数_python算法-快速排序
  8. 物联网操作系统Hello China V1.76(PC串口版)版本发布
  9. NYOJ-心急的C小加(贪心)
  10. Anaconda常用命令大全
  11. axure share联网失败
  12. 广州的11个辖区_广东广州下辖的11个行政区域一览
  13. 500 G JAVA视频网盘分享(JEECG开源社区)
  14. (八)列表操作2(函数番外篇)
  15. 怎么用计算机直接截图,电脑怎样截图又快又方便 1分钟教你如何快速截图
  16. 前端实习日记(6月前两周)
  17. 用Visio画软件(模块)功能图
  18. 教你巧用万用表测量大值电阻
  19. nyoj 吃土豆 234 (双层DP)
  20. python免费下载歌曲_实现python批量下载网易云音乐的免费音乐

热门文章

  1. NSURLConnection 实现webView显示HTTPS页面
  2. 前端工程师和设计师必读文章推荐【系列三十三】
  3. Linux下如何查看哪些端口处于监听状态
  4. DNS服务在网络中的应用
  5. 又学一招,记录之,数字日期互转
  6. 谈中型项目下的编码技巧二
  7. linux centos yum 报错 one of the configured repositories failed 解决方法
  8. linux 安装 nslookup
  9. jenkins 反序列化漏洞 cve-2017-1000353
  10. ATTCK矩阵 linux系统安全实践