返回

浏览器同源策略及跨域实现方法

前端

浏览器同源策略

浏览器同源策略(Same-Origin Policy,SOP)是一种安全机制,它限制了不同源的网页之间的交互。SOP的目的是保护用户免受跨站脚本攻击(XSS)和其他安全威胁。

所谓同源,是指两个网页具有相同的协议、域名和端口。例如,https://www.example.com/index.htmlhttps://www.example.com/about.html 是同源的,而 http://www.example.com/index.htmlhttps://www.example.com/index.html 不是同源的。

SOP限制了不同源的网页之间的以下操作:

  • 读取或写入cookies
  • 读取或写入本地存储
  • 发送Ajax请求
  • 使用WebSockets

跨域

跨域是指两个不同源的网页之间的通信。跨域通信通常是必要的,例如,当一个网页需要从另一个网页加载数据时。

有几种方法可以实现跨域通信,包括:

  • 使用HTTP请求
  • 使用cookies
  • 使用web sockets
  • 使用Ajax

HTTP请求

HTTP请求是最常用的跨域通信方法。HTTP请求可以用于从另一个网页加载数据,也可以用于向另一个网页发送数据。

要发送HTTP请求,可以使用XMLHttpRequest对象。XMLHttpRequest对象是浏览器的内置对象,它允许网页与服务器进行通信。

以下是一个使用XMLHttpRequest对象发送HTTP请求的示例:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://www.example.com/data.json');
xhr.send();

xhr.onload = function() {
  if (xhr.status === 200) {
    // 请求成功
    var data = JSON.parse(xhr.responseText);
    console.log(data);
  } else {
    // 请求失败
    console.error(xhr.statusText);
  }
};

Cookies

Cookies是浏览器写入的一小段信息片段,只有同源的网页才能共享。Cookies可以用于存储用户数据,例如,用户名和密码。

要设置cookie,可以使用document.cookie属性。以下是一个设置cookie的示例:

document.cookie = 'username=john';

要获取cookie,可以使用document.cookie属性。以下是一个获取cookie的示例:

var cookies = document.cookie;
var username = cookies.split('=')[1];

WebSockets

WebSockets是一种双向通信协议,它允许网页与服务器进行实时通信。WebSockets可以用于构建实时聊天应用程序和其他需要实时通信的应用程序。

要使用WebSockets,可以使用WebSocket对象。WebSocket对象是浏览器的内置对象,它允许网页与服务器建立WebSocket连接。

以下是一个使用WebSocket对象建立WebSocket连接的示例:

var ws = new WebSocket('wss://www.example.com/chat');

ws.onopen = function() {
  // 连接成功
  console.log('Connected to the chat server.');
};

ws.onmessage = function(event) {
  // 接收到消息
  console.log(event.data);
};

ws.onclose = function() {
  // 连接关闭
  console.log('Disconnected from the chat server.');
};

ws.send('Hello, world!');

Ajax

Ajax是一种使用XMLHttpRequest对象的异步通信技术。Ajax可以用于从另一个网页加载数据,也可以用于向另一个网页发送数据。

Ajax请求是异步的,这意味着它不会阻塞网页的渲染。当Ajax请求正在进行时,网页可以继续渲染。

以下是一个使用Ajax加载数据的示例:

$.ajax({
  url: 'https://www.example.com/data.json',
  success: function(data) {
    // 请求成功
    console.log(data);
  }
});

绕过浏览器同源策略

浏览器同源策略是一种安全机制,它限制了不同源的网页之间的交互。但是,有几种方法可以绕过浏览器同源策略,包括:

  • 使用JSONP
  • 使用CORS
  • 使用WebSockets
  • 使用HTML5 postMessage

JSONP

JSONP是一种使用<script>标签加载数据的技术。JSONP可以绕过浏览器同源策略,因为它不使用XMLHttpRequest对象。

以下是一个使用JSONP加载数据的示例:

<script src="https://www.example.com/data.json?callback=myCallback"></script>

<script>
  function myCallback(data) {
    console.log(data);
  }
</script>

CORS

CORS是一种允许不同源的网页进行通信的HTTP协议。CORS需要服务器的支持。

要启用CORS,需要在服务器端设置CORS头。以下是一个在Node.js中设置CORS头的示例:

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  next();
});

WebSockets

WebSockets是一种双向通信协议,它允许网页与服务器进行实时通信。WebSockets可以绕过浏览器同源策略,因为它使用了不同的协议。

以下是一个使用WebSockets绕过浏览器同源策略的示例:

var ws = new WebSocket('wss://www.example.com/chat');

ws.onopen = function() {
  // 连接成功
  console.log('Connected to the chat server.');
};

ws.onmessage = function(event) {
  // 接收到消息
  console.log(event.data);
};

ws.onclose = function() {
  // 连接关闭
  console.log('Disconnected from the chat server.');
};

ws.send('Hello, world!');

HTML5 postMessage

HTML5 postMessage是一种允许不同源的网页进行通信的API。HTML5 postMessage需要使用<iframe>标签。

以下是一个使用HTML5 postMessage绕过浏览器同源策略的示例:

<iframe src="https://www.example.com/iframe.html"></iframe>

<script>
  var iframe = document.querySelector('iframe');

  iframe.addEventListener('message', function(event) {
    console.log(event.data);
  });

  iframe.contentWindow.postMessage('Hello, world!', '*');
</script>

结论

浏览器同源策略是一种安全机制,它限制了不同源的网页之间的交互。但是,有几种方法可以绕过浏览器同源策略。