2016-08-26 5 views
0

Я только что узнал о JWT для аутентификации. Хранение токена JWT в localStorage/sessionStorage распространяется на XSS. Хранение его в cookie уязвимо для CSRF. Я изучал это, и я думал об этом решении, но я не уверен, насколько это безопасно, и если я буду использовать его в производстве.Безопасные способы реализации CSRF free JWT аутентификации

Душевное желание получить токен JWT с сервера, сохранить его в cookie. Создайте токен CSRF (который будет сохранен в JWT), который будет отправлен с каждой HTML-страницей, либо в скрытом поле HTML как глобальная переменная JS(). Этот токен CSRF будет отправляться с каждым запросом с использованием JS/AJAX. Таким образом, мы можем исключить CSRF, а затем проверить токен JWT.

Я не уверен, должен ли быть отправлен новый токен с каждой загруженной страницей или один токен должен быть проведен за сеанс. Первый случай будет означать, что может быть отправлена ​​только последняя загруженная страница/форма (что может быть проблематично, если пользователь открывает несколько вкладок других страниц).

Это безопасное решение, которое может быть использовано в производстве?

Кроме того, какие другие решения были бы жизнеспособными для достижения одной и той же цели?

+1

JWT, связанные с аутентификацией API, я не думаю, что нет необходимости в CSRF, так как вы аутентифицировать ваш запрос с JWT уже, или вы можете блокировать запрос перекрестный происхождения и ограничить его в некоторых областях –

+0

я не думаю, вы читали мой пост, но в любом случае, см. здесь, почему защита CSRF необходима при хранении токена аутентификации в файлах cookie. https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage –

ответ

0

Вот мое понимание проблемы.

  • JWT Токен - хранится в HTTPOnly/безопасного печенья - это гарантирует, любой Javascript не имеет доступа к нему
  • CSRF токен - сохраняемую JS - на входе в систему, установите требования в качестве заголовка (включая вашего значения CSRF)

Когда JS получает заголовок, он может хранить заявку в хранилище файлов cookie, localstorage или сеанса. Поскольку JS не имеет доступа к токену JWT в cookie, присоединяя CSRF с каждым запросом и удостоверяясь, что он соответствует тому, что находится в JWT, вы гарантируете, что это ваша JS-отправка запроса и что это был ваш сервер, который выдал маркер.

Скрытое поле не является отличным решением, потому что вам нужно будет добавить его к каждому запросу. В зависимости от того, какие рамки вы используете, вы должны иметь возможность загружать токен CSRF во все, что отвечает за отправку маркера в качестве заголовка для каждого запроса при обновлении страницы. Преимущество наличия всех претензий в локальном хранилище или в файле cookie заключается в том, что вы можете сохранить состояние переднего конца пользователя. Имея требование exp, вы можете сказать, когда пользователь больше не имеет действительного токена в защищенном cookie-файле cookie jwt, и вы можете перенаправить на страницу входа.

  • sessionstorage - специфичен к закладке только
  • LocalStorage - специфично для домена через вкладку
  • печенья - специфично для домена через вкладку

Добавить CSFR на запрос AJAX:

$.ajax({ 
     type:"POST", 
     beforeSend: function (request) 
     { 
      request.setRequestHeader("CSRF-TOKEN", csrfToken); 
     }, 
     url: "entities", 
     data: "json=" + escape(JSON.stringify(createRequestObject)), 
     processData: false, 
     success: function(msg) { 
      $("#results").append("The result =" + StringifyPretty(msg)); 
     } 
}); 

Даже если вы не используете Угловой, это все еще применяется. Вы должны присоединить токен в виде заголовка с JS, и это прекрасно, чтобы получить это значение из файла cookie.

От Angular JS Documentation

При выполнении запросов XHR, служба $ HTTP читает лексему из печенья (по умолчанию, XSRF-токен) и устанавливает его в качестве заголовка HTTP (X-XSRF-ЗНАК) , Поскольку только JavaScript, который работает в вашем домене, может читать файл cookie, ваш сервер может быть уверен, что XHR получен из JavaScript, запущенного в вашем домене.

+0

Спасибо за ответ , Несколько баллов, которые вы неправильно поняли: «Значок CSRF - сохранен JS», он не будет храниться JS. Он будет отправлен сервером на каждой HTML-странице либо как скрытое поле, либо как глобальная переменная JS ('echo '';' Кроме того, Я не использую ничего, кроме jQuery/JS-клиентской и PHP-серверной. Мое понимание заключалось в том, чтобы отправить токен csrf в регулярную переменную POST с помощью AJAX. Как я могу отправить это в заголовок? –

+1

Если вы положите CSRF в cookie, вам не нужно добавлять его к каждому запросу, чтобы сделать его доступным для PHP, он будет включен автоматически. Если вы не хотите использовать файл cookie, вы можете добавить заголовок в AJAX запрос - см. отредактированный пост. – blur0224

+0

Благодарим вас за решение заголовка. Но не сохраняет ли токен CSRF в файле cookie фактически игнорировать цель токена CSRF? –

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