Отсутствует токен CSRF, Ionic - AngularJS FullStack

У меня есть проект с серверной частью в стеке MEAN, запущенный с помощью генератора полного стека AngularJS и приложение под Ionic, когда я пытаюсь выполнить запрос POST для входа в систему из приложения Ionic, сервер говорит: «Отсутствует токен CSRF»

{"error":{"message":"CSRF token missing","stack":"Error: CSRF token missing\n    at checkCsrf (/Volumes/Data/Dev/carry/back/node_modules/lusca/lib/csrf.js:89:18)\n    at /Volumes/Data/Dev/carry/back/node_modules/lusca/index.js:48:21\n    at hsts (/Volumes/Data/Dev/carry/back/node_modules/lusca/lib/hsts.js:25:9)\n    at /Volumes/Data/Dev/carry/back/node_modules/lusca/index.js:48:21\n    at xframe (/Volumes/Data/Dev/carry/back/node_modules/lusca/lib/xframes.js:12:9)\n    at /Volumes/Data/Dev/carry/back/node_modules/lusca/index.js:48:21\n    at xssProtection (/Volumes/Data/Dev/carry/back/node_modules/lusca/lib/xssprotection.js:16:9)\n    at /Volumes/Data/Dev/carry/back/node_modules/lusca/index.js:48:21\n    at lusca (/Volumes/Data/Dev/carry/back/node_modules/lusca/index.js:53:9)\n    at Layer.handle [as handle_request] (/Volumes/Data/Dev/carry/back/node_modules/express/lib/router/layer.js:95:5)\n    at trim_prefix (/Volumes/Data/Dev/carry/back/node_modules/express/lib/router/index.js:312:13)\n    at /Volumes/Data/Dev/carry/back/node_modules/express/lib/router/index.js:280:7\n    at Function.process_params (/Volumes/Data/Dev/carry/back/node_modules/express/lib/router/index.js:330:12)\n    at next (/Volumes/Data/Dev/carry/back/node_modules/express/lib/router/index.js:271:10)\n    at /Volumes/Data/Dev/carry/back/node_modules/express-session/index.js:432:7\n    at /Volumes/Data/Dev/carry/back/node_modules/connect-mongo/lib/connect-mongo.js:305:11\n    at handleCallback (/Volumes/Data/Dev/carry/back/node_modules/mongoose/node_modules/mongodb/lib/utils.js:96:12)\n    at /Volumes/Data/Dev/carry/back/node_modules/mongoose/node_modules/mongodb/lib/collection.js:1341:5\n    at handleCallback (/Volumes/Data/Dev/carry/back/node_modules/mongoose/node_modules/mongodb/lib/utils.js:96:12)\n    at /Volumes/Data/Dev/carry/back/node_modules/mongoose/node_modules/mongodb/lib/cursor.js:670:5\n    at handleCallback (/Volumes/Data/Dev/carry/back/node_modules/mongoose/node_modules/mongodb-core/lib/cursor.js:154:5)\n    at nextFunction (/Volumes/Data/Dev/carry/back/node_modules/mongoose/node_modules/mongodb-core/lib/cursor.js:675:5)"}}

хотя, как видно из запроса, он отправляет токен и другие данные

POST /auth/local HTTP/1.1
Host: 192.168.1.13:9000
Connection: keep-alive
Content-Length: 47
Accept: application/json, text/plain, */*
X-DevTools-Emulate-Network-Conditions-Client-Id: 552547EB-CA80-4AF8-8392-DDE2A9D833A4
Origin: file://
User-Agent: Mozilla/5.0 (Linux; Android 5.1.1; E5803 Build/32.0.A.4.11; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.106 Mobile Safari/537.36
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Accept-Language: en-US
Cookie: connect.sid=s%3AKpTipuTW9UAqmbx_X__fuDrfGxXiGRpF.%2FKf2gm3y%2F0VwBzUygchh7%2BVfi6PLoQZhOfI5T22XlxY; XSRF-TOKEN=iZvZ2wKb3VafJb9ZGqily3pBY3nGI9gVBQaww%3D
X-Requested-With: com.todomicilio.app

я не изменяю стандартную конфигурацию экспресс-сервера


person Andres Vargas    schedule 01.03.2016    source источник


Ответы (3)


Если вы не хотите использовать токены CSRF, отключите Lusca.

Пожалуйста, обратитесь по ссылке ниже

https://github.com/angular-fullstack/generator-angular-fullstack/issues/1582

person krish007    schedule 01.03.2016

Кажется, вы забыли добавить токен csrf в <form></form>, который вы используете для создания POST в html.

В ваших данных есть CSRF-токен только в куках, вам также необходимо иметь CSRF-токен в форме (или в специальном заголовке http-запроса, это зависит от реализации защиты).

Несколько слов о подделке межсайтовых запросов (CSRF):

  1. Как сделать CSRF-атаку:

Представьте, что у нас есть сайт «hacker.example», а также мы знаем о другом сайте «bank.example», который работает с деньгами. Представьте, что у bank.example есть метод POST /send-money для отправки денег с текущей учетной записи пользователя на другую учетную запись с параметром receiver-account и банком, использующим cookie для авторизации пользователя.

Представьте, что пользователь из банка зашел на сайт хакера и нажал кнопку отправки формы на bank.example/send-money с хакерским значением параметра receiver-account. Итак, браузер сделает этот POST-запрос к сайту bank.example с куками для bank.example(!), поэтому, если у банка нет защиты от CSRF, этот запрос будет авторизован, и хакер получит деньги от этого пользователя.

  1. Как защититься от CSRF-атаки (одно из возможных решений):

Вы можете поместить два секретных токена: один в файл cookie и один для каждого почтового запроса для веб-сайта. Сервер должен сравнивать эти два токена каждый раз, когда пользователь делает почтовый запрос.

  1. Почему это работает?

Теперь hacker.example должен знать токен csrf, чтобы сделать соответствующий запрос POST. У хакера есть только два возможных варианта его получения: из куки для bank.example или извлечь токен csrf из html кода из bank.example.

Но hacker.example не имеет доступа к файлам cookie от bank.example из-за политики безопасности, а hacker.example не может получить html-страницу для извлечения токена csrf из <form> из bank.example из-за CORS.

person Timur Bilalov    schedule 01.03.2016
comment
Очень красивое объяснение!! - person vinesh; 16.04.2016

Хотя немного поздно, но я хотел бы ответить, так как я столкнулся с той же проблемой. Вот решение проблемы:

https://github.com/angular-fullstack/generator-angular-fullstack/pull/2613

«Когда express.static() обслуживает index.html, он разрывает цепочку промежуточного программного обеспечения и избегает установки CRSF по запросу /, что приводит к сбою первого входа в систему, когда у пользователей не установлены файлы cookie.

Я думаю, что это связано и, возможно, исправляет # 2224, # 2511, # 2611 и krakenjs/lusca # 95

Этот коммит в основном переименовывает _index.html в app.template.html, что является более выразительным, а сгенерированный файл будет app.html, что позволяет избежать блокировки express.static() цепочки промежуточного программного обеспечения, потому что index.html больше нет. Поэтому эффективно вызывается route.js:sendFile.

Обратите внимание, что я МНОГО пробовал и играл с webpack, пытаясь найти другое решение, это было самое элегантное, что я мог найти».

person Prajwal Bhati    schedule 27.12.2017