在网站开发中,我们常常会遇到 JS 同源策略,那么什么是同源?为什么同源策略这么重要?这篇文章将为你一一解答。
JS同源策略详解:什么是同源?
在网站开发中,我们常常会遇到 JS 同源策略,那么什么是同源?为什么同源策略这么重要?这篇文章将为你一一解答。
同源(Same-origin)是由同一个协议(protocol)、主机名(host)和端口号(port)组成,若三者相同,则是同源。例如:
- https://www.example.com 和 https://www.example.com/blog 是同源。
- https://www.example.com 和 https://blog.example.com 不是同源。
- https://www.example.com 和 https://www.example.com:8080 不是同源。
JS同源策略的作用
同源策略可以保证一个网站的 JavaScript 代码只能与同源网站的接口进行交互,其它源被禁止访问,从而避免了恶意代码的攻击。
例如,一个页面上通过 iframe 引入了一个来自危险网站的恶意脚本,但由于这些代码所属的源与主页面源不一致,因此在同源策略的限制下,这些脚本无法对主页面进行窃取或篡改,保证了网站的安全性。
JS同源策略的限制:
- 无法读取非同源网站的 Cookie、LocalStorage 和 IndexedDB
- 无法向非同源网站发起 AJAX 请求
- 无法获取非同源网站的 Document、Window 和 Location 对象
- 无法通过 iframe 或 frame 加载非同源页面
JS同源策略的应用:
1. JSONP
JSONP 是一种跨域获取数据的技术,通过在页面中动态插入<script>标签,来加载包含 JSON 数据的脚本文件。JSONP 是基于函数调用来实现的,因为同一个页面内的 JavaScript 函数的调用是没有跨域限制的。
例如,我们可以通过如下代码,获取到http://www.example.com/jsonp接口返回的 JSON 数据:
function handleResult(data){
console.log(data);
}
const script = document.createElement('script');
script.src = 'http://www.example.com/jsonp';
document.head.appendChild(script);
服务器返回的数据格式如下:
handleResult({ "result": "success" });
2. CORS
CORS(Cross-Origin Resource Sharing)是一个标准,它允许网页从不同的域访问其它域的资源。通过在服务端设置 Access-Control-Allow-* 头部的字段,可以允许其它域名的请求访问资源。
例如,在上传图片时,我们需要将图像转化为数据流,然后上传到服务器:
const canvas = c.getContext('2d');
const img = new Image();
img.crossOrigin = 'anonymous'; // 允许跨域请求图像
img.src = 'https://www.example.com/image.jpg';
img.onload = function(){
canvas.width = img.width;
canvas.height = img.height;
canvas.drawImage(img, 0, 0);
const imageData = canvas.toDataURL('image/png');
fetch('https://www.example.com/upload', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: `imageData=${encodeURIComponent(imageData)}`,
}).then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
}
在服务器端,需要添加如下头部字段,允许来自任意域名的请求:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: Content-Type
综上,JS同源策略作为 Web 安全的基础之一,掌握同源策略,可以帮助我们更好地处理跨域问题,提升代码的安全性。
本文标题为:js同源策略详解
基础教程推荐
- vue离线环境如何安装脚手架vue-cli 2025-01-19
- this[] 指的是什么内容 讨论 2023-11-30
- 浅谈Vue2和Vue3的数据响应 2023-10-08
- 浅析canvas元素的html尺寸和css尺寸对元素视觉的影响 2024-04-26
- Ajax实现动态加载数据 2023-02-01
- CSS3的几个标签速记(推荐) 2024-04-07
- js禁止页面刷新与后退的方法 2024-01-08
- 关于文字内容过长,导致文本内容超出html 标签宽度的解决方法之自动换行 2023-10-28
- 基于Vue制作组织架构树组件 2024-04-08
- JS前端广告拦截实现原理解析 2024-04-22
