js同源策略详解

yizhihongxing

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同源策略的限制:

  1. 无法读取非同源网站的 Cookie、LocalStorage 和 IndexedDB
  2. 无法向非同源网站发起 AJAX 请求
  3. 无法获取非同源网站的 Document、Window 和 Location 对象
  4. 无法通过 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同源策略详解 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • javascript判断变量是否有值的方法

    当我们使用JavaScript编程时,有时候需要判断一个变量是否具有值。在这种情况下,我们需要使用不同的方法来检查它是否具有值。下面就是“JavaScript判断变量是否有值的方法”的完整攻略。 方法一:typeof操作符 typeof操作符可以用来检测一个变量的类型。当变量值为undefined时,typeof会返回”undefined”。这意味着我们可以…

    JavaScript 2023年6月10日
    00
  • JavaScript手写一个前端存储工具库

    标题:JavaScript手写一个前端存储工具库 简介 前端存储工具库是用于在客户端存储数据的工具,常见的有Cookie、localStorage、sessionStorage等。今天我们将学习如何手写一个前端存储工具库,以方便我们在实际开发中使用。 代码实现 我们将实现一个名为store的前端存储工具库,支持以下功能: 存储:可支持存储值类型、对象类型以及…

    JavaScript 2023年5月27日
    00
  • js截取字符串的两种方法及区别详解

    当我们需要在JavaScript中处理字符串时,常常需要对字符串进行截取。本篇攻略将会详细讲解js截取字符串的两种方法及其区别。 一、JavaScript中substring()方法 let str = "hello world"; let strNew = str.substring(3); console.log(strNew); 上…

    JavaScript 2023年5月28日
    00
  • 详解Angular操作cookies方法

    以下是详解Angular操作cookies方法的完整攻略: 1. 什么是cookies Cookies 是指在浏览器中存储小型文本数据的一种机制,它们通常用于跟踪用户、记住用户的偏好设置等功能。 2. 在Angular中使用cookies 通常在Angular中使用第三方库来操作cookies。这里介绍两个常用的库: ngx-cookie-service n…

    JavaScript 2023年6月11日
    00
  • 浅谈js中变量初始化

    浅谈js中变量初始化 在JavaScript中声明变量时,可以选择是否初始化变量,即为变量分配一个初始值。如果我们忘记为变量分配初始值,则变量的初始值将为undefined。 为什么要初始化变量? 初始化变量可以确保在使用变量之前,变量已经存储了一个值,从而减少出现意外错误的可能。在变量的使用中,确保它们拥有正确的初始值是良好的编程习惯。 变量定义时进行初始…

    JavaScript 2023年6月10日
    00
  • JS防止网页被嵌入iframe框架的方法分析

    基础方法 如果我们想要阻止我们的网页被嵌入在 iframe 框架中,可以在代码中加入以下的 JS 代码: if (self != top) { top.location.href = self.location.href; } 这段代码的作用是检测当前页面是否在顶级窗口中打开,如果不是顶级窗口,那么将会通过修改顶级窗口的 URL 来让页面跳出框架。 利用 X…

    JavaScript 2023年6月11日
    00
  • jQuery插件jsonview展示json数据

    下面是关于如何使用jQuery插件jsonview展示JSON数据的完整攻略。 1. 安装JSONView插件 JSONView是一款非常流行的jQuery插件,可以展示JSON数据的格式化结果。你可以通过以下两种方式安装: 手动下载JSONView: 下载JSONView,解压压缩包后将jsonview文件夹复制到你的项目目录中。 使用npm: 在命令行中…

    JavaScript 2023年5月27日
    00
  • JS将秒换成时分秒实现代码

    下面是JS将秒换成时分秒实现代码的完整攻略: 1. 获取秒数 首先,我们需要获取要转换的秒数,可以通过以下方式获取: let seconds = 12345; // 需要转换的秒数 2. 计算时分秒 通过以下代码可以将秒数转换为时分秒的形式: let hours = Math.floor(seconds / 3600); // 计算小时数 let minut…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部