2015-07-06 3 views
3

У меня есть sailsJS-сервер. Я пытаюсь отправить почтовый запрос от клиента в другой домен.Я получаю 403 CSRF Несоответствие, когда я пытаюсь отправить запрос «сообщение» на сервер SailsJS

Я посылаю _csrf из/csrfToken, но я получаю 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: '[email protected]', 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:[email protected] 
password:password 

Помогите мне, пожалуйста!

ответ

1

Я не знаком с SailsJs, но, проведя несколько минут на их документации, что вы делаете, кажется правильным, но я хотел бы попробовать пару вещей

  1. Попробуйте установить _csrf в заголовке.
  2. Изменение origin в module.exports.csrf до * module.exports.csrf = { grantTokenViaAjax: true, origin: '*' }
+0

Спасибо, Киран, но не работает – derzunov

+0

Я бы не рекомендовал этот подход. установка CSRF-источника в подстановочный знак приведет к тому, что сайт-румянин сможет извлекать и помещать токен CSRF. Преодоление цели CSRF. – goingsideways

1

Вы должны отправить его в заголовке

Добавить X-CSRF-токен:

$.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: '[email protected]', password: 'password'} 
     error:() -> 
      console.log 'error' 
     success: (resp) -> 
      console.log resp 
    }) 
}) 
+0

Спасибо за ответ, но это не помогло. Ответ: XMLHttpRequest не может загрузить http://myserverdomain.ru/session/create. Поле заголовка запроса. X-CSRF-токен не разрешен заголовками Access-Control-Allow-Headers. Должен ли я изменить «heders» в module.exports.cors? – derzunov

+0

Я добавил заголовок 'headers: 'content-type, X-CSRF-Token'', но сервер отвечает несоответствием 403 CSRF снова – derzunov

+0

Странно, кстати, я не использую grantTokenViaAjax и origin в csrf.js, также по умолчанию используется cors.js. Не могли бы вы попробовать его по умолчанию csrf.js и cors.js? Комментировать все в cors.js. В csrf.js у меня есть только module.exports.csrf = true ;. Попробуйте просто для быстрого теста. И убедитесь, что вы перезапустили приложение. У меня даже нет X-CSRF-токена в заголовках. Я также не использую вызов/csrfToken. Я использую шаблон EJS, поэтому, когда мне нужно использовать _csrf, мне нравится: data: {_csrf: <%= _csrf %>, email: 'mail @ mail', password: 'password'}, поэтому _csrf будет включен в отображаемый html. –

Смежные вопросы

 Смежные вопросы