本文已参与掘金创作者训练营第三期「话题写作」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力。
简单粗暴的回答就是同源策略导致的不能跨域请求资源,接下来会为大奖详细的去解读为什么 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页面的安全性。
非同源的页面浏览器之间不能自己随意去操作,只能通过浏览器提供的方式去操作。
比如说:
- 读取数据和操作 DOM 要用跨文档机制。
- 跨域请求要用 CORS 机制。
- 引用第三方资源要用 CSP。
点赞支持、手留余香、与有荣焉,动动你发财的小手哟,感谢各位大佬能留下您的足迹。
往期精彩推荐
Git 相关推荐
面试相关推荐
更多精彩详见:个人主页