跨域 CSRF 令牌检查失败

我有一个www.example.com从 加载 iframe 的网站www.another.com。正在加载的页面包含 HTML 和 JS,它们会触发对 self ( ) 的 AJAX 调用www.another.com。这两个站点都支持 HTTPS。


iframe 加载得很好,脚本正在执行,但是,当我单击“提交”(这是 iframe 的一部分)时,www.another.com由于 CSRF 令牌无效,我的请求被拒绝。iframe 中的表单确实包含一个token字段,该字段具有一个值(一些哈希值)。


当我直接访问时,ajax 调用工作正常www.another.com。


据我所知,到目前为止,当 ajax 调用到达服务器时,它没有启动会话,因此它无法找到匹配的令牌。


我使用Symfony 4.4withNelmioCorsBundle来确保正确的 CORS。配置如下所示:


nelmio_cors:

    defaults:

        allow_credentials: false

        origin_regex: false

        allow_origin: ['https://www.example.com','https://www.another.com']

        allow_methods: ['GET', 'OPTIONS', 'POST']

        allow_headers: ['Origin','Referer']

        expose_headers: []

        max_age: 3600

失败的 ajax 请求有以下标头: 

http://img.mukewang.com/6496b2e00001caaa04320506.jpg

有什么办法可以解决这个问题吗?


开心每一天1111
浏览 93回答 1
1回答

九州编程

找到了解决方案。该域www.another.com正在发送Cookie带有SameSite=lax.&nbsp;这意味着除非启动顶级导航,否则不会包含这些 cookie。对于iframeAJAX 调用来说,这并不能解决问题。解决此问题的方法是SameSite禁用framework.yml.session: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cookie_samesite:&nbsp;null&nbsp;<---&nbsp;THIS我很清楚潜在的安全后果,但是:AJAXPOST端点受 CSRF 令牌保护,这两个网站都是 HTTPS……所以我想我会没事的。我是吗?我真的很期待听到是否存在比我上面概述的问题更严重的问题:)我想指出的另一件事是我的 CORS 配置并非完全无关紧要。我的所有请求都是“简单”的,因此不会触发预检请求。
打开App,查看更多内容
随时随地看视频慕课网APP