Реализация CSRF в ReactJS PWA с прокси ExpressJS для API-интерфейса - PullRequest
1 голос
/ 03 октября 2019

У меня есть следующие настройки:

  1. Приложение внешнего интерфейса ReactJS PWA, которое использует сервисных работников для кэширования исходного кода для клиента.
  2. Обратный прокси-сервер ExpressJS, который передает любой запрос, который будетперейти к поддерживаемому API. Это обрабатывает процесс входа в систему, сохраняет токен на сервере и отправляет файл cookie сеанса клиенту. Файл cookie является HtttpOnly, SameSite, Secure и подписан. Прокси-сервер также проверяет, является ли соединение безопасным, реферер находится в белом списке и точно совпадает с хостом.
  3. Backend API находится на другом сервере с защитой входа OAuth.

Express возвращает страницу, отображаемую на стороне сервера, при первой загрузке, затем ReactJS увлажняет эту страницу и использует ее в качестве SPA. Каждый файл впоследствии кэшируется в браузере.

Каждый запрос, поступающий от клиентского приложения, обрабатывается с помощью того же токена, поскольку они не являются пользовательскими операциями. Для определенных пользовательских операций требуется электронная почта и пароль для получения нового уникального токена от API.

Моя проблема: злоумышленник может создать cookie и отправить его вместе с запросом прокрутки прокси-серверу. Это могло бы обойтись без моего приложения ReactJS, так как и реферер, и хост могут быть подделаны.

Я хотел бы узнать, как можно защитить соединение между прокси-сервером ExpressJS и PWA ReactJS.

Iдумал о CSRF с csurf , но это не сработало. Если PWA установлен на телефоне как приложение, то он будет получать доступ к прокси только при отправке запроса. Поэтому я не могу установить заголовок CSRF.

Если бы я должен был добавить токен CSRF к самому первому запросу, когда клиент обращается к серверу, и страница отображается с помощью SSR, я бы установил токен только один раз,который может быть использован столько раз, сколько хочет злоумышленник.

Есть ли правильный способ как-то заблокировать прокси для приложения?

Я не могу хранить что-либо в локальном хранилище и труднокод токенов в исходный код приложения. (Это небезопасные варианты)

Спасибо!

...