Cookies 解释了CSRF、令牌和同源策略

Cookies 解释了CSRF、令牌和同源策略,cookies,token,csrf,same-origin-policy,Cookies,Token,Csrf,Same Origin Policy,所以我知道有很多关于CSRF的问题(因为我读过其中一些),但有一点我仍然不明白。让我们设想以下情况: 我(使用cookies)登录到我的服务器,其中有一个带有“删除我的帐户”按钮的页面。我不想逼你 我访问黑客的服务器: a。我的浏览器请求'bad.html',其中包含JS,并定义了一个回调函数。它还有如下脚本:(从而避免了同源策略问题) b。脚本“附加”后,浏览器将加载页面,然后调用hackerCallback,并将页面HTML文本作为参数传递 c。使用此HTML,回调可以解析其中的令牌 hac

所以我知道有很多关于CSRF的问题(因为我读过其中一些),但有一点我仍然不明白。让我们设想以下情况:

  • 我(使用cookies)登录到我的服务器,其中有一个带有“删除我的帐户”按钮的页面。我不想逼你

  • 我访问黑客的服务器:

    a。我的浏览器请求'bad.html',其中包含JS,并定义了一个回调函数。它还有如下脚本:(从而避免了同源策略问题)

    b。脚本“附加”后,浏览器将加载页面,然后调用hackerCallback,并将页面HTML文本作为参数传递

    c。使用此HTML,回调可以解析其中的令牌

  • hackerCallback现在拥有令牌,在“deleteMyAccount”页面上向我的服务器发送一个Ajax请求

  • 我的帐户现在被删除了,因为令牌、cookie甚至浏览器跟踪都与服务器注册的匹配

  • 你如何避免这种行为?我读过一些关于在我的服务器上只允许某些头的内容。这将缩短我的服务器上的所有跨域请求,但是根据这个链接()这是不够的。。。(我完全相信)

    谢谢你的帮助
    Seba-1511

    您正在使用JSONP,以便通过scr标记发出跨域请求。JSONP只允许用于GET请求,并且不应该让GET端点进行更改(而不是幂等)

    deleteAccount应该是无法通过JSONP请求的POST端点


    如果您坚持使用GET-on-deleteAccount,您应该使用CSRF令牌或将令牌发送到标头中,而不是发送cookie(如果您使用的是XHR请求)

    您知道这一点吗?你能再解释一下callback=hackerCallback吗?您希望删除页面如何处理“回调”查询字符串参数?当然,删除页面不应该只执行通过uri传入的任何javascript。不,我还没有弄明白这一点。callback=hackerCallback指定响应返回给用户后将调用的函数。(它将由浏览器而不是服务器执行)这允许黑客解析从原始服务器返回的页面,从而获得正确的令牌以绕过CSRF安全机制。您能否提供域的示例?e、 g.
    s.src=”http://www.example.com/deleteAccountPage.html?“
    http://www.evil.com/bad.html
    看起来像是
    hackerCallback
    evil.com
    上的JS函数,对吗?谢谢你的评论。JSONP用于获取令牌,而不是删除帐户。因此,我们希望执行GET请求。删除操作可以在步骤3中使用跨域POST请求完成。您可以在案例中添加类似JSFIDLE的内容。
    var s = document.createElement('script'); 
        s.src = 'url to "deleteAccountPage" of my server?'
        s.src += 'callback=hackerCallback'; 
        s.type = 'text/javascript';
    document.body.appendChild(s);