同源策略
字数 1301 2025-11-13 14:40:28

同源策略

  1. 同源策略是浏览器实施的一种核心安全机制。它的根本目的是隔离不同源的文档,防止恶意网站窃取另一个网站的数据或与之进行未经授权的交互。

  2. “源”由三个部分共同定义:协议域名端口。只有当两个资源的这三者完全相同时,它们才属于“同源”。例如:

    • https://www.example.com/page.html 尝试访问 https://www.example.com/other.html -> 同源(协议、域名、端口均相同)。
    • https://www.example.com/page.html 尝试访问 http://www.example.com/other.html -> 不同源(协议不同,HTTPS vs HTTP)。
    • https://www.example.com/page.html 尝试访问 https://api.example.com/data.json -> 不同源(域名不同,主域名 vs 子域名)。
    • https://www.example.com/page.html 尝试访问 https://www.example.com:8080/service -> 不同源(端口不同,443 vs 8080)。
  3. 同源策略主要限制以下类别的跨源交互:

    • DOM访问:一个源的脚本无法读取或修改另一个源页面的DOM元素、Cookie或LocalStorage等数据。
    • 网络请求:通过 XMLHttpRequestfetch API发起的请求通常会受到限制(尽管请求可以被发送,但浏览器默认会阻止脚本读取返回的响应)。
    • 客户端存储:不同源的站点无法访问彼此存储在浏览器中的数据。
  4. 然而,互联网的运作离不开合理的跨源合作。因此,现代浏览器提供了一些受控的机制来安全地放宽同源策略:

    • 跨源资源共享(CORS):这是最常用的标准方法。当浏览器检测到跨源请求时,它会向目标服务器发送一个 Origin 头,标明请求来源。服务器如果同意合作,会在响应中包含如 Access-Control-Allow-Origin: https://www.example.com 这样的头部。浏览器见到这个允许的头部后,才会让脚本访问响应内容。
    • 跨文档消息传递(postMessage):提供了一个安全的API,允许来自不同源的窗口/iframe之间进行双向通信。发送方使用 targetWindow.postMessage() 发送数据,接收方通过监听 message 事件来安全地接收。
    • JSONP(JSON with Padding):一种较老的变通方法,利用 <script> 标签天然可跨源加载的特性来获取数据。由于其安全性较弱(无法处理错误,且完全信任服务器脚本),现已逐渐被CORS取代。
  5. 理解同源策略是理解Web应用安全的基础。它构建了默认的“安全沙箱”,而CORS等机制则是在这堵墙上开设的、受监管的“门”。开发者必须正确配置这些机制,才能在实现功能的同时,不破坏Web应用的安全模型。

同源策略 同源策略是浏览器实施的一种核心安全机制。它的根本目的是隔离不同源的文档,防止恶意网站窃取另一个网站的数据或与之进行未经授权的交互。 “源”由三个部分共同定义: 协议 、 域名 和 端口 。只有当两个资源的这三者完全相同时,它们才属于“同源”。例如: https://www.example.com/page.html 尝试访问 https://www.example.com/other.html -> 同源 (协议、域名、端口均相同)。 https://www.example.com/page.html 尝试访问 http://www.example.com/other.html -> 不同源 (协议不同,HTTPS vs HTTP)。 https://www.example.com/page.html 尝试访问 https://api.example.com/data.json -> 不同源 (域名不同,主域名 vs 子域名)。 https://www.example.com/page.html 尝试访问 https://www.example.com:8080/service -> 不同源 (端口不同,443 vs 8080)。 同源策略主要限制以下类别的跨源交互: DOM访问 :一个源的脚本无法读取或修改另一个源页面的DOM元素、Cookie或LocalStorage等数据。 网络请求 :通过 XMLHttpRequest 或 fetch API发起的请求通常会受到限制(尽管请求可以被发送,但浏览器默认会阻止脚本读取返回的响应)。 客户端存储 :不同源的站点无法访问彼此存储在浏览器中的数据。 然而,互联网的运作离不开合理的跨源合作。因此,现代浏览器提供了一些受控的机制来安全地放宽同源策略: 跨源资源共享(CORS) :这是最常用的标准方法。当浏览器检测到跨源请求时,它会向目标服务器发送一个 Origin 头,标明请求来源。服务器如果同意合作,会在响应中包含如 Access-Control-Allow-Origin: https://www.example.com 这样的头部。浏览器见到这个允许的头部后,才会让脚本访问响应内容。 跨文档消息传递(postMessage) :提供了一个安全的API,允许来自不同源的窗口/iframe之间进行双向通信。发送方使用 targetWindow.postMessage() 发送数据,接收方通过监听 message 事件来安全地接收。 JSONP(JSON with Padding) :一种较老的变通方法,利用 <script> 标签天然可跨源加载的特性来获取数据。由于其安全性较弱(无法处理错误,且完全信任服务器脚本),现已逐渐被CORS取代。 理解同源策略是理解Web应用安全的基础。它构建了默认的“安全沙箱”,而CORS等机制则是在这堵墙上开设的、受监管的“门”。开发者必须正确配置这些机制,才能在实现功能的同时,不破坏Web应用的安全模型。