同源策略(SOP)Same-origin policy

同源策略是一种Web浏览器的安全性机制,用于限制一个起源上的脚本访问另一个起源的数据。本文介绍了同源策略的基本概念、实施方式及其例外情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是同源策略?

同源策略是一种Web浏览器安全性机制,旨在防止网站相互攻击。

同源策略限制一个起源上的脚本访问另一个起源的数据。源由URI方案,域和端口号组成。例如,考虑以下URL:

http://normal-website.com/example/example.html

这将使用协议http,域normal-website.com和端口号80。下表显示了如果上述URL上的内容尝试访问其他来源时将如何应用同源策略:

网址已访问	允许访问?
http://normal-website.com/example/	是:相同的协议,域和端口
http://normal-website.com/example2/	是:相同的协议,域和端口
https://normal-website.com/example/	否:不同的协议和端口
http://en.normal-website.com/example/	否:其他域
http://www.normal-website.com/example/	否:其他域
http://normal-website.com:8080/example/	否:不同的端口*

*IE浏览器将允许此访问,因为在应用相同来源策略时IE不会考虑端口号。

为什么必须采用同源策略?

当浏览器将HTTP请求从一个来源发送到另一个来源时,与另一个域相关的任何cookie(包括身份验证会话cookie)也将作为请求的一部分发送。这意味着响应将在用户的会话中生成,并包括特定于用户的任何相关数据。如果没有同源策略,则如果您访问了恶意网站,它将能够从GMail读取电子邮件,从Facebook读取私人消息等。

同源策略如何实施?

同源策略通常控制JavaScript代码对跨域加载的内容的访问。通常允许页面资源的跨域加载。例如,SOP允许通过<img>标签嵌入图像,通过标签嵌入媒体,并且<video>标签包含JavaScript <script>。但是,尽管这些外部资源可以由页面加载,但是页面上的任何JavaScript都无法读取这些资源的内容。

同源策略有多种例外情况:

  • 有些对象是可写的,但跨域却不可读,例如iframe或新窗口中的location对象或location.href属性。
  • 某些对象是可读但不可写的跨域对象,例如对象的length属性window(存储页面上正在使用的帧数)和closed属性。
  • 该replace函数通常可以称为location对象上的跨域。
  • 你可以跨域调用某些函数。例如,你可以调用的功能close,blur并focus在一个新的窗口。postMessage也可以在iframe和新窗口上调用该函数,以便将消息从一个域发送到另一个域。

由于遗留要求,在处理cookie时,同源策略更加宽松,因此,即使每个子域在技术上都是不同的来源,也通常可以从站点的所有子域访问它们。您可以使用HttpOnlycookie标志来部分缓解这种风险。

可以使用放宽同源策略document.domain。此特殊属性允许您放宽特定域的SOP,但前提是它是FQDN(完全限定域名,fully qualified domain name)的一部分。例如,您可能有一个域,marketing.example.com并且想在上读取该域的内容example.com。为此,两个域都需要设置document.domain为example.com。然后,SOP将允许两个域之间的访问,尽管它们起源不同。过去,可以将document.domainTLD设置为com,例如,允许在同一TLD上的任何域之间进行访问,但是现在现代浏览器阻止这种情况。

在 Python 中,"strict-origin-when-cross-origin" (简称 SOP) 不是一个直接的 Python 概念,它通常是指同源策略Same-Origin Policy)的一个扩展概念,这个策略是 web 浏览器用来限制不同源之间数据交互的安全策略。在 JavaScript 中,SOP 原则确保了只有从同一个源(协议、域名和端口)发起的请求才能访问其他资源,如 cookies 和 API。 在讨论 Python 的上下文中,它可能是指 Flask 或 Django 等 Web 框架中用于处理跨域资源共享(Cross-Origin Resource Sharing, CORS)的配置选项。当你使用这些框架时,`strict-origin-when-cross-origin` 是一种 CORS 配置策略,它表示只有来自源站(`Access-Control-Allow-Origin`)的跨域请求才会应用更严格的策略,即只允许那些与原始请求来源相同的 origin。 具体设置例子: ```python from flask import Flask, jsonify, make_response app = Flask(__name__) app.config['CORS_HEADERS'] = 'Content-Type' app.config['CORS_ORIGINS'] = ['http://example.com', 'https://subdomain.example.com'] @app.after_request def after_request(response): if response.status_code == 200 and request.method == 'OPTIONS': response = make_response(jsonify({'allow_credentials': True, 'access_control_allow_credentials': True, 'access_control_allow_headers': '*', 'access_control_allow_methods': '*', 'access_control_allow_origin': '*'}), 204) response.headers['Access-Control-Max-Age'] = '1728000' # 20 days return response # 使用时确保在需要设置 CORS 的路由上应用此策略 @app.route('/api/data') @cross_origin(origins=['*'], allow_headers='*', strict_origin_when_cross_domain=True) def my_api(): # ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值