Web服务器如何执行同源策略?


24

我正在更深入地开发RESTful API,到目前为止,已经与一些不同的框架合作来实现这一目标。当然,我遇到了同源策略,现在我想知道Web服务器(而不是Web浏览器)如何实施它。据我了解,浏览器端似乎发生了一些强制执行(例如,遵守从服务器收到的Access-Control-Allow-Origin标头)。但是服务器呢?

例如,假设一个Web服务器托管了一个访问API的Javascript Web应用程序,该API也托管在该服务器上。我假设服务器将执行同源策略---以便仅允许该服务器上托管的javascript访问API。这样可以防止其他人为该API编写JavaScript客户端并将其托管在另一个网站上,对吗?那么,Web服务器如何能够阻止恶意客户端,该客户端试图声称对其API端点发出AJAX请求,同时声称正在运行源自同一Web服务器的javascript?最受欢迎的服务器(Apache,nginx)如何防御这种攻击?还是我对此的理解不合时宜?

还是跨域策略仅在客户端实施?


一个非常好的问题
本尼2015年

Answers:


46

相同的来源策略是完全基于客户端的限制,主要是为了保护用户而不是服务而设计的。所有或大多数浏览器都包含一个命令行开关或配置选项以将其关闭。SOP就像汽车上的安全带:它们保护汽车上的骑手,但任何人都可以自由选择不使用它们。当然,不要指望一个人的安全带阻止他们下车并攻击您(或访问您的Web服务)。

假设我编写了一个访问您的Web服务的程序。这只是一个发送包含HTTP请求的TCP消息的程序。您正在请求一种服务器端机制,以区分程序发出的请求(可以发送任何内容)和浏览器发出的请求(从允许的来源加载页面)。根本无法做到;我的程序始终可以发送与网页形成的请求相同的请求。

发明了同源策略,因为它阻止一个网站的代码访问另一站点上受凭证限制的内容。默认情况下,Ajax请求与目标站点授予的所有auth cookie一起发送。例如,假设我不小心加载了http://evil.com/,它发送了的请求http://mail.google.com/。如果SOP不到位,并且我已登录Gmail,则处的脚本evil.com可以看到我的收件箱。如果evil.com要加载的站点mail.google.com没有我的Cookie,则可以使用代理服务器;的公开内容mail.google.com不是秘密(但mail.google.com使用我的cookie访问时的内容秘密)。


7

同源策略在客户端实施。如果浏览器支持CORS,则服务器可以发送回标头,以告知浏览器对同源策略进行例外处理。例如,发送标题

 Access-Control-Allow-Origin: www.example.com

会告诉浏览器允许来自www.example.com的跨域请求。

 Access-Control-Allow-Origin: *

告诉浏览器允许对该资源进行所有跨域请求。


3

Web服务器通常通过检查RefererHTTP标头中的(臭名昭著的)拼写错误来防止此类攻击,以确保请求来自其自己站点上的页面。没有防范恶意客户端的好方法,但这不是XSRF攻击的工作方式。

客户端不是恶意的;通常是普通用户,受到恶意第三方的欺骗,他们打开了一个使用客户端存储的cookie静默发出HTTP请求的文档。因此,如果服务器可以通过验证RefererHTTP请求来自gmail.com,而不是MyAwesomeWebsite.com,则它可以关闭攻击。


如果引荐来源行是恶意伪造的怎么办?
本尼2015年

@Benny:那是极不可能的。该Referer行是由用户的Web浏览器生成的,用户是此处的受害者,而不是攻击者。他没有理由伪造Referer,并且攻击者没有机会这样做。
梅森惠勒2015年

1

Web服务器如何执行同源策略?

简而言之,正如杀虫剂德克指出的那样,它们不是。
一个重要的原因是ACAO标头保护服务器自身免受猖ramp的DDOS(分布式拒绝服务)攻击

谁:

ACAO作为HTTP响应标头是用于解释Web客户端的,假定大多数人类互联网用户正在通过遵守并实施W3C建议草案的主要浏览器供应商来浏览Web 。毕竟,他们大多数人应该受益于快速,可访问的互联网。

怎么样:

否则,任何人都可以将几行javascript代码复制并粘贴到运行简单循环的恶意网站中,从而使Ajax GET或POST请求到达外部域。没有用户交互,并且具有多线程的能力。

因此,您必须选择通过ACAO HTTP标头访问跨域站点。您(用户)可以随时通过用户感知的交互(即Internet链接)访问所述站点。就像您可以感知用户将内容从剪贴板复制或粘贴到剪贴板一样,但不能以其他任何方式-除了插件。

未来:

届时,请注意网络浏览器制造商的发展方向:

可以结合使用TSL 2/3,强会话ID,TAN,两因素身份验证等来建立安全性限制。

'Google'可以显示和说明DDOS

最后,任何人都可以自由代理任何Web内容并添加所需的ACAO标头以访问代理的跨站点内容。同样,此代理也可以像ACAO设置允许的那样对DDOS攻击开放。我实际上不知道有一个免费的公共服务产品。如果我错了,请纠正我。


0

正如其他人所说,这取决于客户。但是服务器可能需要处理绕过SOP的XSS。

Supopse服务器允许用户上载内容,该内容在其他用户浏览您的站点时显示。此页面是一个很好的例子-我刚刚上传了内容,并向您显示。
如果我的内容包含<script>标签,并且服务器只是将其复制到它生成的HTML中,那么我上载的脚本将运行。
由于脚本是从文件中的HTML中找到的,因此它具有站点脚本的所有权限。例如,它可以支持该答案。这就是为什么这个答案有很多投票的原因。

好的Web服务器(例如,StackExchange使用的服务器)不会让这种情况发生。它可以删除<script>标签,也可以对其进行转义,以便将其显示出来但不会执行(警告-此答案与防止XSS的可靠方法相距甚远)。

因此,强制执行SOP的是客户端,但是在某些情况下,服务器应该工作以防止绕过它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.