聊聊为什么 XMLHTTPRequest 不能跨域请求资源

2,135 阅读4分钟

本文已参与掘金创作者训练营第三期「话题写作」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力

简单粗暴的回答就是同源策略导致的不能跨域请求资源,接下来会为大奖详细的去解读为什么 XMLHTTPRequest 不能跨域请求资源。

首先简单聊一下什么是 XMLHTTPRequest

历史: 1999年诞生,微软在IE5中集成了XMLHttpRequest对象,但是并没有受到人们重视。 2005年,google在gtalk即时聊天工具中使用了该对象,从此之后Ajax技术开始受到人们的重视

创建XMLHTTPRequest对象要分为(低版本) IE和非IE两种方式(主流)

IE浏览器(IE7之前) :

      var xhr = new ActiveXObject('Msxml2.XMLHTTP');

非IE浏览器(chrome、firefox、safair、搜狗等,包括IE7+之后) (主流浏览器):

 var xhr = new XMLHttpRequest();

案例: 创建XMLHttpRequest对象,兼容IE7之前和主流浏览器

//创建XMLHttpRequest对象,兼容低版本IE和非IE浏览器
function getXhr () {
    var xmlhttp;

    if (window.XMLHttpRequest) {
        //IE7+ 和 非IE 中都有 XMLHttpRequest对象
        xmlhttp = new XMLHttpRequest();
    } else {
    	//低版本IE浏览器 实例化方式
        xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
    }

    return xmlhttp;
}

XMLHttpRequest 对象是 W3C 的标准吗?

任何 W3C 推荐标准均未规定 XMLHttpRequest 对象。

不过,W3C DOM Level 3 的 "Load and Save" 规范包含了一些相似的功能性,但是还没有任何浏览器实现它们。

再聊一下什么是跨域

跨域:浏览器不能执行其他网站的脚本。简单来说,就是网站A去调用网站B的数据。

常见案例:hao123.com的天气预报。

跨域导致的原因

由浏览器的同源策略造成的,是浏览器对 JavaScript 实施的安全限制。

什么是同源策略

同源策略(Same origin policy)是一种约定,他是浏览器的一种安全功能。

同源策略会隔离不同源的 DOM、页面数据和网络通信,进而实现 Web 页面的安全性。

何为同源

同源:同协议,同域名,同端口;不同源则为跨域。

例子👀 与wwww.baidu.com/ 相对比

网址是否同源原因
api.baidu.com/details.htm…域名不同
www.baidu.com/details.htm…协议不同
www.baidu.com:8088/details.htm…端口不同
api.baidu.com:8080/details.htm…域名、端口不同
api.baidu.com/details.htm…协议、域名不同
www.baidu.com:8080/details.htm…协议、端口不同
www.baidu.com/details/ind…只是目录不同

安全和便利性的权衡

页面可以引入第三方资源

比如,恶意程序在 HTML 文件内容中插入 JavaScript 代码,当这段 HTML 文件的数据被送达浏览器时,浏览器是无法区分被插入的文件是恶意的还是正常的,这样恶意脚本就寄生在页面之中,当页面启动时,它可以修改用户的搜索结果、改变一些内容的连接指向,等等。

除此之外,它还能将页面的的敏感数据,如 Cookie、IndexDB、LoacalStorage 等数据通过 XSS 的手段发送给服务器。具体来讲就是,当你不小心点击了页面中的一个恶意链接时,恶意 JavaScript 代码可以读取页面数据并将其发送给服务器。

以上就是一个非常典型的 XSS 攻击。为了解决 XSS 攻击,浏览器中引入了内容安全策略,称为 CSP。CSP 的核心思想是让服务器决定浏览器能够加载哪些资源,让服务器决定浏览器是否能够执行内联 JavaScript 代码。通过这些手段就可以大大减少 XSS 攻击。

跨域资源共享和跨文档消息机制

跨域资源共享(CORS) 使用该机制可以进行跨域访问控制,从而使跨域数据传输得以安全进行。 跨文档消息机制 可以通过 window.postMessage 的 JavaScript 接口来和不同源的 DOM 进行通信。

总结

同源策略、CSP 和 CORS 之间的关系: 同源策略会隔离不同源的DOM、页面数据和网络通信,进而实现Web页面的安全性。

非同源的页面浏览器之间不能自己随意去操作,只能通过浏览器提供的方式去操作。

比如说:

  1. 读取数据和操作 DOM 要用跨文档机制。
  2. 跨域请求要用 CORS 机制。
  3. 引用第三方资源要用 CSP。

点赞支持、手留余香、与有荣焉,动动你发财的小手哟,感谢各位大佬能留下您的足迹。

往期精彩推荐

前端性能优化实战

聊聊让人头疼的正则表达式

获取文件blob流地址实现下载功能

Git 相关推荐

通俗易懂的 Git 入门

git 实现自动推送

我在工作中是如何使用 git 的

面试相关推荐

前端万字面经——基础篇

前端万字面积——进阶篇

更多精彩详见:个人主页