Я использую nuxt для интерфейса, phoenix / elixir для сервера API и nginx для обратного прокси.
Я ударился о стену, когда попытался сделать форму для загрузки файлов.
Как мне работать с csrf
?
Если вы не используете сеансы на своем сервере феникс-каркас API (и используете что-то вроде токенов аутентификации, например), самым простым вариантом будет отключить CSRF. Вы можете сделать это, удалив заглушку :protect_from_forgery
из конвейера маршрутизатора:
pipeline :browser do
plug :accepts, ["html"]
plug :fetch_session
plug :fetch_flash
# plug :protect_from_forgery ## REMOVE THIS
end
Note: SPAs generally use the :api
pipeline, where this is excluded by default
CSRF обеспечивает множество преимуществ в плане безопасности, особенно для веб-приложений на основе сеансов, поэтому для вас может иметь смысл продолжать его использовать (если вместо этого вы не используете что-то вроде маркер авторизации). Обычно это может быть немного сложнее в интерфейсных SPA, но основной процесс заключается в следующем:
Визуализируйте токен CSRF (обычно в скрытом поле или переменной JS), используя get_csrf_token/0
на вашей веб-странице при первоначальном запросе
Прочтите значение и отправьте его обратно на сервер в заголовке запроса X-CSRF-TOKEN
в ваших последующих вызовах ajax
Через некоторое время повторно сгенерируйте новый токен CSRF на сервере и отправьте его обратно в заголовках ответа существующего запроса или в ответе специального запроса только для токена.
Сохраните его в своем веб-приложении для следующего запроса, отличного от GET
.
(Assuming that your SPA isn't a completely separate frontend project and is atleast partially server-rendered)
Вот еще несколько ресурсов:
Я использую сеанс cookie, разве сеанс cookie не обеспечивает достаточной безопасности?
Зависит от вашего варианта использования, но короткий ответ - «Нет». Чтобы упростить работу с SPA, я бы лично рекомендовал отключить CSRF и вместо этого использовать токены аутентификации. Вы должны явно отправлять токен аутентификации в заголовке запроса для каждого вызова ajax, который вы делаете.
Два пути: а) Если это полностью отдельный SPA, токен авторизации будет лучшим выбором. б) Если интерфейс рендерится на сервере с несколькими компонентами Nuxt / Vue, разбросанными в разных местах, то придерживайтесь CSRF.
Спасибо за совет!
Если вы взаимодействуете со своим сервером только через AJAX, вы можете отключить защиту CSRF и потребовать настраиваемый заголовок запроса, по совету OWASP.
Я опубликовал два ответа: один отключает CSRF, а другой использует его.