当前位置: 首页 > 面试题库 >

当存在诸如JSONP和CORS之类的变通方法时,为什么浏览器具有同源策略?

燕扬
2023-03-14
问题内容

这个问题有点重复:为什么XMLHttpRequest的原始策略相同

但是,此答案并不令人满意,因为它没有解决存在变通方法的事实(如问题中所述)。答案仅解决了与XMLHttpRequest直接相关的安全性问题,但是JSONP仍然存在这些问题(可能不确定CORS)。因此,问题仍然存在-
当存在诸如JSONP之类的变通方法甚至更糟(因为它是可执行文件而不是静态内容)时,为什么要制定严格的Same Origin策略?

这是一个示例:Company.com希望对一些不受保护的资源进行AJAX调用,例如用于一些数据查找的简单公共API。Company.com意识到这可能是不安全的,因此他们将仔细清理数据以确保没有可笑的事情。但是,XMLHttpRequest不允许这样做,因此Company.com必须使用JSONP,但这将防止数据清理,并可能导致攻击者向页面注入任意Javascript。这是一个更好的解决方案吗?

另一个例子:Company.com存在漏洞,攻击者能够将Javascript注入页面,然后某些用户可以查看该页面(可能有百万种发生方式;这可能是最常见的网站攻击)。使用严格的“同源来源”策略,攻击者可以整天弄乱页面,但他不能“回拨”,这是一个重要的细节,因为这意味着您的所有数据都是安全的。但是JSONP(和图像标签)通过允许攻击者从页面抓取您的所有个人数据并将其发送到任何地方而打破了这一点。即使使用CORS,这仍然是现实,因为我可以告诉流氓服务器允许来自任何域的入站XS请求。

换句话说,在哪种情况下,锁定的XMLHttpRequest实际上可以提供更高的安全性吗?


问题答案:

您的前提不正确。同源策略没有说明网页在外部域中包含资源的能力。这样可以防止通过不同来源的脚本直接访问资源,而无需选择它们。

因此,CORS和JSONP并非Same
Origin策略的解决方法。CORS使Origin可以选择加入具有响应的XHR请求,而JSONP只是一种黑客,它允许外部引用将动态数据返回到页面。

这里的重点是保护您的页面,这样一来就不可能使用XSS。为此,重点应放在正确编码输出到页面的文本上。这将防止“打电话回家”,因为首先不可能进行攻击。一个内容安全策略可以帮助中和管理通过网滑倒任何脚本。您网站上的定期安全漏洞评估应获取未编码的输出-
将CSP视为在找到和修复它们之间的空白,尽管浏览器还不完全支持(尤其是Internet
Explorer)。

但是,XMLHttpRequest不允许这样做,因此Company.com必须使用JSONP,但这将防止数据清理,并可能导致攻击者向页面注入任意Javascript。这是一个更好的解决方案吗?

它不是。CORS是更好的解决方案,因为请求将检索数据而不是可执行代码。CORS允许XMLHttpRequest做到这一点。

使用CORS响应标头Access-Control-Allow-Origin,网站所有者example.com可以将其设置为

Access-Control-Allow-Origin: https://company.com

以仅允许company.com客户端通过用户浏览器通过HTTPS访问数据。

在这种CORS方案中,example.com仅信任company.com该特定请求的数据响应。与Access-Control-Allow- Credentials标头结合使用时,他们可以选择在其浏览器处向用户请求用户的任何授权Cookie,并将其与请求一起发送,并在处由JavaScript读取响应company.com

在JSONP情况下,company.com将信任example.com他们的整个原产地
。这意味着他们信任example.com整个客户端站点安全模型。Example.com可以对company.com网站进行任何操作。因此,如果example.com受到黑客的威胁,company.com一旦每个用户访问包含<script src="https//example.com/…标签的页面,他们也可以控制用户会话。

换句话说,在哪种情况下,锁定的XMLHttpRequest实际上可以提供更高的安全性吗?

互联网上无处不在。

假设您已登录Gmail。出于争议考虑,假设Gmail具有一种AJAX方法,该方法可以获取您的收件箱内容:

https://gmail.com/services/inbox/get_conversations

现在,您正在浏览网页,并进入了我的网站evil.com

Evil.com包含一些向发出POST请求的JavaScript
https://gmail.com/services/inbox/get_conversations,它将在您登录时将cookie从发送gmail.comgmail.com

处的服务https://gmail.com/services/inbox/get_conversations将忠实地返回收件箱中的内容。

如果没有使用“相同来源策略”
evil.com将其锁定,则将能够读取此响应中的数据。即任何站点都可以阅读您的电子邮件。使用“相同来源策略”时,数据将返回到浏览器,但没有客户端脚本可以读取数据gmail.com(当然还有CORS允许的任何其他来源)。例如,在这种情况下,Google可能允许以下内容:

Access-Control-Allow-Origin: https://google.com

注意:以上所有内容均由我作为示例进行说明,绝不反映Google和Gmail的实际操作方式。原则上是一样的。



 类似资料:
  • 我很难理解同源策略和“解决”它的不同方法。 很明显,同源策略是作为一种安全措施存在的,因此来自服务器/域的脚本不能访问来自另一服务器/域的数据。 也很明显,有时打破这一规则是很有用的,例如mashup应用程序访问来自不同服务器的信息以构建所需的结果。做到这一点的方法之一是CORS。 1)如果我没有错的话,CORS允许目标服务器通过在响应中添加一些标题来对浏览器说“您可以从自己那里获取数据/代码”。

  • 问题内容: 什么是可能的原因,或任何其他DOM方法/ jQuery选择没有找到的元素? 问题示例包括: jQuery默默地未能绑定事件处理程序 jQuery的“吸气”方法(,,)返回 返回标准DOM方法会导致以下几种错误: 未捕获的TypeError:无法设置为null的属性“ …”未捕获的TypeError:无法读取为null的属性“ …” 最常见的形式是: 未捕获的TypeError:无法将属

  • 这是否意味着浏览器拒绝用户向谷歌服务器发送请求,或者谷歌服务器拒绝响应用户的任何反馈?CORS限制将JavaScript限制为获取数据,所以我有点困惑。

  • 本文向大家介绍js判断当前浏览器类型,判断IE浏览器方法,包括了js判断当前浏览器类型,判断IE浏览器方法的使用技巧和注意事项,需要的朋友参考一下 判断IE浏览器最短方法:var isIE = !-[1,] 原理:[1,]在标准浏览器中返回"1",相当于调用[1,].toString(),在IE中返回"1," 在这个时候对返回值使用负号强制转换为数字时,标准浏览器返回1,IE则返回NaN, 再对1

  • 本文向大家介绍请描述你对浏览器同源策略的理解相关面试题,主要包含被问及请描述你对浏览器同源策略的理解时的应答技巧和注意事项,需要的朋友参考一下 出于浏览器的安全考虑,避免沾染其他域的恶意文件代码,只有协议,域名,端口都相同的文档才能被读写; 解决同源策略的方法: CORS(跨域资源共享),在服务端设置Access-Control-Allow-Origin等相关的属性 利用proxy设置转发请求

  • 本文向大家介绍HTML5的应用程序缓存与浏览器缓存有什么不同?相关面试题,主要包含被问及HTML5的应用程序缓存与浏览器缓存有什么不同?时的应答技巧和注意事项,需要的朋友参考一下 应用程序缓存是 HTML5 的重要特性之一,提供了离线使用的功能,让应用程序可以获取本地的网站内容,例如 HTML、CSS、图片以及 JavaScript。这个特性可以提高网站性能,它的实现借助于 manifest 文件