【问题标题】:I Get 403 CSRF Mismatch when I'm trying to send the "post" request to SailsJS server当我尝试将“发布”请求发送到 SailsJS 服务器时,我得到 403 CSRF Mismatch
【发布时间】:2015-09-23 21:29:59
【问题描述】:

我有一个sailsJS 服务器。我尝试从另一个域的客户端发送发布请求。

我从 /csrfToken 发送 _csrf,但我一次又一次收到 403 csrf 不匹配

客户端代码如下所示:

    $.ajax({
                  url: 'http://myserverdomain.ru/csrfToken'
                  success: (response) ->
                      $.ajax({
                          url: 'http://myserverdomain.ru/session/create'
                          type: "POST"
                          crossDomain: true
                          xhrFields: {
                              withCredentials: true
                          }
                          data: {_csrf: response._csrf, email: 'mail@mail', password: 'password'}
                          error: () ->
                              console.log 'error'
                          success: ( resp ) ->
                              console.log resp
                      })
            })

服务器配置:

module.exports.csrf = {
    grantTokenViaAjax: true,
    origin: 'http://myclientdomain.ru'
};


module.exports.cors = {

  allRoutes: true,

  origin: 'http://myclientdomain.ru',

  credentials: true,

  methods: 'GET, POST, PUT, DELETE',

  headers: 'content-type'

响应如下所示:

CSRF mismatch

一般:

Remote Address:ip.ip.ip.1:1010
Request URL:http://myserverdomain.ru/session/create
Request Method:POST
Status Code:403 Forbidden

请求的标头:

Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Content-Length:95
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:sails.sid=s%3A_HBoGJvI9N_-kH3Bj2LBrIrayWAb_k4z.N9P%2F%2Bt%2FDWCFAuK1MvBNjyYO1ntmp5m8a5Te0IM%2Ftn7s; BCSI-CS-c82c2a7dcc10e8b5=2
Host:myserverdomain.ru
Origin:http://myserverdomain.ru
Proxy-Connection:keep-alive
Referer:http://myserverdomain.ru/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36

表单数据:

_csrf:ljGDMpSr-_O1ktMJ-zHEJfWaKPygXwNSSjcU
email:mail@mail
password:password

请帮帮我!

【问题讨论】:

    标签: javascript ajax cross-domain sails.js csrf


    【解决方案1】:

    我对 SailsJs 不熟悉,但在他们的文档上花费了几分钟后,您所做的似乎是正确的,但我会尝试几件事

    1. 尝试在标题中设置 _csrf。
    2. module.exports.csrf中的origin改为* module.exports.csrf = { grantTokenViaAjax: true, origin: '*' }

    【讨论】:

    • 我不会推荐这种方法。将 CSRF 来源设置为通配符将导致 rouge 站点能够检索和发布 CSRF 令牌。违背 CSRF 的目的。
    【解决方案2】:

    你必须在标题中发送它

    添加 X-CSRF-Token:

    $.ajax({
    url: 'http://myserverdomain.ru/csrfToken'
    success: (response) ->
      $.ajax({
          url: 'http://myserverdomain.ru/session/create'
          type: "POST"
          crossDomain: true
          beforeSend: function(xhr, settings){
              xhr.setRequestHeader('X-CSRF-Token', '_PUT_YOUR_CSRF_HERE_');
          }
          xhrFields: {
              withCredentials: true
          }
          data: {_csrf: response._csrf, email: 'mail@mail', password: 'password'}
          error: () ->
              console.log 'error'
          success: ( resp ) ->
              console.log resp
      })
    })
    

    【讨论】:

    • 感谢您的回答,但没有帮助。响应:XMLHttpRequest 无法加载 myserverdomain.ru/session/create。 Access-Control-Allow-Headers 不允许请求头字段 X-CSRF-Token。我应该更改 module.exports.cors 中的“heders”吗?
    • 我添加了一个标头headers: 'content-type,X-CSRF-Token',但服务器再次响应 403 CSRF mismatch
    • 奇怪,顺便说一下我在c​​srf.js中没有使用grantTokenViaAjax和origin,cors.js也是默认的。你能用默认的 csrf.js 和 cors.js 试试吗?注释 cors.js 中的所有内容。在 csrf.js 我只有 module.exports.csrf = true;。试一试只是为了快速测试。并确保重新启动应用程序。我什至在标题中都没有 X-CSRF-Token。我也不使用 /csrfToken 调用。我使用 EJS 模板,所以当我必须使用 _csrf 时,我喜欢:data: {_csrf: , email: 'mail@mail', password: 'password'},所以 _csrf 将包含在渲染中html.
    • 代码 "" 在跨域 ajax 中不起作用 =) 只有 /csrfToken 可以为 csrf 配置中允许的另一个域返回 csrf。
    • 我可以看到您在请求标头中发送了一个 cookie。该 cookie 是否来自对 /csrfToken 的请求?如果没有,您可以尝试从 /csrfToken 响应中获取 set-cookie 标头,并将其与 /session/create 请求作为 Cookie 标头一起发回。您可以使用 xhr.getResponseHeader("set-cookie") 获取 set-cookie 标头,并使用 xhr.setRequestHeader('Cookie', 'PUT_YOUR_COOKIE_FROM_RESPONSE_HERE'); 发回;
    【解决方案3】:

    在 config/crfs.js 中,添加这些行和您的路线:

    module.exports.csrf = {
      grantTokenViaAjax: true
      , routesDisabled: '*Route URLs*',
      'origin': '*'
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-25
      • 1970-01-01
      • 2019-02-26
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 2019-09-03
      • 2016-03-23
      相关资源
      最近更新 更多