Чи безпечно зберігати jwt в localStorage за допомогою reactjs?


147

Зараз я будую додаток на одній сторінці за допомогою reactjs. Я читав, що багато причин невикористання localStorage пов’язані з уразливістю XSS. Оскільки React уникає всіх даних користувачів, чи стало б безпечно використовувати localStorage?


4
віддайте перевагу Session Storage
Praneet Rohida


3
"Рекомендується не зберігати будь-яку конфіденційну інформацію в локальному сховищі." -OWASP "зберігайте їх у пам'яті без будь-якої наполегливості" -Auth0
avejidah

Я думаю, що Auth0, можливо, змінив свою точку зору з цього приводу - тому що я не можу знайти цитату в наведеному посиланні
DauleDK

Відповіді:


141

У більшості сучасних додатків для однієї сторінки нам дійсно доводиться зберігати маркер десь на стороні клієнта (найпоширеніший випадок використання - щоб користувач увійшов у систему після оновлення сторінки).

Всього доступно 2 варіанти: Веб-зберігання (зберігання сеансу, локальне зберігання) та cookie на стороні клієнта. Обидва варіанти широко використовуються, але це не означає, що вони дуже безпечні.

Том Ебботт добре підсумовує сесію JWTСайми для зберігання та локальну безпеку :

Веб-сховище (localStorage / sessionStorage) доступне через JavaScript в одному домені. Це означає, що будь-який JavaScript, що працює на вашому веб-сайті, матиме доступ до веб-сховища, і через це може бути вразливим для атак міжсайтового скриптування (XSS) . У двох словах, XSS - це тип вразливості, коли зловмисник може вводити JavaScript, який працюватиме на вашій сторінці. Основні XSS-атаки намагаються ввести JavaScript через введення форми, де зловмисник вводить <script>alert('You are Hacked');</script>форму, щоб побачити, чи керує він браузером і чи можуть його переглядати інші користувачі.

Для запобігання XSS загальною відповіддю є уникнення та кодування всіх ненадійних даних. Реагуйте (в основному) це для вас! Ось чудова дискусія про те, наскільки захист уразливості XSS відповідає React .

Але це не охоплює всіх можливих уразливостей! Ще одна потенційна загроза - використання JavaScript, розміщеного на CDN або зовнішній інфраструктурі .

Ось знову Том:

Сучасні веб-програми включають сторонні бібліотеки JavaScript для тестування A / B, аналіз воронки / ринку та рекламу. Ми використовуємо менеджери пакетів, як Bower, для імпорту коду інших людей у ​​наші програми.

Що робити, якщо порушено лише один із сценаріїв, якими ви користуєтесь? Зловмисний JavaScript може бути вбудований на сторінку, а Веб-зберігання порушено. Ці типи XSS-атак можуть отримати веб-сховище кожного, хто відвідує ваш сайт, без їх відома. Ймовірно, тому група організацій радить не зберігати нічого корисного або довіряти будь-якій інформації у веб-сховищі. Сюди входять ідентифікатори і маркери сеансу.

Отже, мій висновок полягає в тому, що як механізм зберігання даних Web Storage не застосовує жодних захищених стандартів під час передачі . Той, хто читає Веб-сховище та використовує його, повинен зробити належну ретельність, щоб переконатися, що вони завжди надсилають JWT через HTTPS та ніколи не HTTP.


10
Тож якщо я вас правильно зрозумів, ви рекомендуєте файли cookie? Просто для переконання. Дякую!
SuperLemon

7
Так. Я рекомендую файли cookie через додаткову безпеку, яку вони надають, та простоту захисту від CSRF за допомогою сучасних веб-рамок. Веб-сховище (localStorage / sessionStorage) є вразливим до XSS, має більшу площу атаки та може впливати на всіх користувачів програми на успішну атаку.
Калоян Косов

48
Я думаю, ти це перемішав? Сучасні веб-рамки мають міцну захисну силу для XSS. Але не стільки для xsrf. Найкращий захист для xsrf - уникати використання файлів cookie повністю. Локальне сховище знаходиться в песочному режимі до певного домену, що означає, що домен зловмисників не може отримати доступ до нього. Веб-фрейми захищають від xss шляхом автоматичного кодування та санації введення користувача. Дивіться angular.io/guide/security
mikejones1477

47
Якщо "ви рекомендуєте файли cookie [замість]", то чи можу я порекомендувати вам сказати це десь у відповіді? А не просто в коментарях?
spechter

7
Я тут трохи пізно, просто зараз читаю ці теми, і я плутаюсь одне, багато людей говорять про те, що ти захищений файлом cookie, що не містить http, якщо ти походить із Xss, але якщо у вас є xss отакерові вам не потрібно нічого красти, він може просто зробити публікацію зі сторінки, щоб видати себе за використання цього файлу cookie (навіть якщо він не може його вкрасти). Я щось пропускаю ???
Борха Альварес

35

Я знаю, що це давнє запитання, але згідно з тим, що сказав @ mikejones1477, сучасні бібліотеки та фреймворки уникають тексту, що забезпечує захист від XSS. Причиною, чому файли cookie не є безпечним методом використання облікових даних, полягає в тому, що файли cookie не перешкоджають CSRF, коли це місцевийStorage (також пам’ятайте, що файли cookie доступні і через javascript, тому XSS не є великою проблемою тут), ця відповідь відновиться, чому .

Причиною зберігання маркера аутентифікації у локальному сховищі та вручну додавати його до кожного запиту захищає від CSRF - це ключове слово: manual. Оскільки браузер не надсилає автоматично цей маркер, якщо я відвідаю evil.com і йому вдасться надіслати POST http://example.com/delete-my-account , він не зможе надіслати мій авторський маркер, так запит ігнорується.

Звичайно, httpOnly - це святий грааль, але ви не можете отримати доступ з reakctjs або будь-якої js-фрейму, поруч із вами ще є вразливість CSRF. Моєю рекомендацією буде локальне зберігання, або якщо ви хочете використовувати файли cookie, переконайтеся, що реалізуєте якесь рішення вашої проблеми з CSRF, як, наприклад, django .

Що стосується CDN, переконайтеся, що ви не використовуєте якогось дивного CDN, наприклад, CDN, такого як Google або Bootstrap, підтримуються спільнотою і не містять зловмисного коду, якщо ви не впевнені, ви можете оглянути.


2
Не впевнений, чому б ви сказали, що ви все ще вразливі до CSRF під час використання cookies. Використання файлу cookie з прапорами HttpOnly SameSite=strictта secureзбереже інформацію, яку ви встановили у файлах cookie. Тоді проти XSS ви просто переконайтеся, що ваш JavaScript не знає жодних даних, пов’язаних з автентифікацією, як токени та паролі (тобто не зберігайте їх у веб-сховищі) - якщо ви імпортуєте шкідливий скрипт, до цього скрипта не буде доступу до конфіденційних даних. Так, ви також не матимете доступу до маркера через JS, але це насправді не повинно бути проблемою.
miphe

@miphe ось що я сказав. Але ОП просить спосіб доступу з javascript. Ось я просто пояснюю, який найкращий спосіб зберігати маркер, доступний від js.
Маурісіо Кортазар

21

В основному це нормально, щоб зберігати свій JWT у вашому локальному сховищі.

І я думаю, що це хороший шлях. Якщо ми говоримо про XSS, XSS з використанням CDN, це також потенційний ризик отримати вхід / пропуск вашого клієнта. Збереження даних у локальному сховищі запобіжить атакам CSRF принаймні.

Вам потрібно бути обізнаним про обидва і вибирати те, що ви хочете. Обидві атаки - це не все, що вам потрібно знати, просто пам’ятайте: ВСЕ ПРИЛОЖЕННЯ ТОЛЬКО ТАКЕ БЕЗПЕЧНО, НАКІЛЬШЕ ЗАБЕЗПЕЧЕННЯ ВАШОГО ПРИЛОЖЕННЯ.

Знову зберігання в порядку, будьте вразливі до XSS, CSRF, ... ні


2
Ось чому це безпечно зробити наступне: - Зберігайте JWT в куки , так що вона не може бути вилучено з XSS - зберігати CSRF токен в LocalStorage тому він не може бути залучена з CSRF
Алехандро Кавазос

33
Ви підказуєте хороший момент: якщо на вашому сайті працює шкідливий сценарій, це все-таки гра. Вони можуть просто прив’язати події клавіатури до входів пароля типу та вкрасти таким чином інформацію про аутентифікацію користувача (що набагато, набагато гірше, ніж викрасти маркер автентичності JWT). Зберігання JWT в localStorage мало що сприяє збільшенню вже величезного можливого збитку від XSS.
Карл Лет

8

Небезпечно, якщо ви використовуєте CDN:

Зловмисний JavaScript може бути вбудований на сторінку, а Веб-зберігання порушено. Ці типи XSS-атак можуть отримати веб-сховище кожного, хто відвідує ваш сайт, без їх відома. Ймовірно, тому група організацій радить не зберігати нічого корисного або довіряти будь-якій інформації у веб-сховищі. Сюди входять ідентифікатори і маркери сеансу.

через шторм

Будь-який сценарій, який ви потребуєте ззовні, може бути скомпрометований і може захопити будь-який JWTS зі сховища вашого клієнта і відправити особисті дані назад на сервер зловмисника.


6
Якщо я не планую використовувати cdns, то це буде безпечно?

1
Автор статті ніколи не робив різниці між XSS на сайтах, що обслуговуються через CDN або безпосередньо з центрального сервера. Невже ваше пояснення тут також не стосується взагалі, не тільки для CDN?
Влад

5

Localstorage розроблений так, щоб бути доступним через javascript, тому він не забезпечує захисту XSS. Як згадується в інших відповідях, існує купа можливих способів зробити XSS-атаку, від якої локальне зберігання за замовчуванням не захищене.

Однак у файлах cookie є прапори безпеки, які захищають від атак XSS та CSRF. Прапор HttpOnly запобігає доступу JavaScript до клієнтського файлу cookie, захищений прапор дозволяє лише браузеру переносити файл cookie через ssl, а прапор SameSite гарантує, що файл cookie буде надісланий лише до походження. Хоча я щойно перевірив, і SameSite зараз підтримується лише в Opera та Chrome, тому для захисту від CSRF краще використовувати інші стратегії. Наприклад, надсилання зашифрованого маркера в інший файл cookie з деякими загальнодоступними даними користувачів.

Тож файли cookie є більш безпечним вибором для зберігання даних аутентифікації.


не можу отримати: як HttpOnly може захистити вас від CSRF?
Олексій Лялька

@AlexLyalka Не хотів сказати, що HttpOnly запобігає виникненню CSRF, а не всі прапорці cookie разом можуть захищати від XSS та CSRF. SameSite забезпечує певний захист, запобігаючи надсиланню файлів cookie на сайт, відмінний від походження. Хоча я щойно перевірив і підтримка цього прапора дуже низька. Також можливо уникнути CSRF з окремим зашифрованим маркером з деякою ідентифікацією користувача, що перевіряється на сервері.
Іван

1
Що ж, якщо хтось може виконати код у вашій мережі, чи не може він просто зробити публікацію на веб-сайті від імені вашого користувача? Гаразд, він не може отримати лише ваші http файли cookie, але він може телефонувати, використовуючи ці файли cookie, тому я все одно не бачу сенсу
Borja Alvarez

2
@BorjaAlverez Є велика різниця. Так, через XSS хтось може надсилати запити від імені зареєстрованого користувача, але компрометація маркера гірша. Наприклад: маркер може надавати доступ до API, які клієнтська програма не використовує; маркер може містити іншу інформацію про користувача (адресу електронної пошти, профіль та гранти); маркер може бути використаний при повторному нападі на вашу програму; маркер може бути переданий як id_token_hintсервер аутентифікації OIDC; маркер надає зловмиснику інформацію про шифр, який використовувався для його підписання; пр.
avejidah

3

Спосіб для цього - це врахувати рівень ризику чи шкоди.

Ви створюєте додаток без користувачів, POC / MVP? Ви стартап, якому потрібно швидко вийти на ринок та протестувати ваш додаток? Якщо так, я б, напевно, просто реалізував найпростіше рішення та зосередився на пошуку придатності товару до ринку. Використовуйте localStorage, як його часто простіше у виконанні.

Ви будуєте v2 програми з багатьма щоденними активними користувачами або програми, від якої сильно залежать люди / компанії. Невже зламання означатиме небагато місця для відновлення? Якщо це так, я б дуже довго розглядав ваші залежності і розглядав питання про збереження токенової інформації у файлі cookie, що містить лише http.

Використання локального зберігання та зберігання файлів cookie / сеансів має свої плюси і мінуси.

Як зазначено в першій відповіді: Якщо у вашої програми є вразливість XSS, це не захистить вашого користувача. Оскільки більшість сучасних додатків мають десяток і більше різних залежностей, стає важче гарантувати, що одна із залежностей вашої програми не є вразливою до XSS.

Якщо у вашої програми є вразливість XSS і хакер зміг її використати, хакер зможе виконувати дії від імені вашого користувача. Хакер може виконувати запити GET / POST, вилучаючи маркер з localStorage або виконувати запити POST, якщо маркер зберігається у файлі cookie, що містить лише http.

Єдина нижня сторона зберігання вашого маркера в локальному сховищі - це хакер зможе прочитати ваш маркер.


1

Чи не прийнятні ні файли cookie localStorage, ні httpOnly? Що стосується компрометованої третьої сторони бібліотеки, єдине мені відоме рішення, яке зменшить / запобіжить крадіжці конфіденційної інформації, буде примусовою цінністю субресурсів .

Цілісність субресурсів (SRI) - це функція безпеки, яка дозволяє браузерам перевіряти, що ресурси, які вони отримують (наприклад, з CDN), доставляються без несподіваних маніпуляцій. Це працює, дозволяючи надати криптографічний хеш, який повинен відповідати вилученому ресурсу.

Поки на вашому веб-сайті діє компромісна бібліотека сторонніх організацій, кейлоггер може почати збирати інформацію, як-от ім’я користувача, пароль та все, що ви вводите на сайт.

Файл cookie httpOnly не перешкоджатиме доступу з іншого комп'ютера, але нічого не зробить, щоб хакер не маніпулював комп'ютером користувача.


-10

Зберігати маркер у localStorage можна безпечно до тих пір, поки ви його зашифруєте. Нижче наведений стислий фрагмент коду, який показує один із багатьох способів зробити це.

    import SimpleCrypto from 'simple-crypto-js';

    const saveToken = (token = '') => {
          const encryptInit = new SimpleCrypto('PRIVATE_KEY_STORED_IN_ENV_FILE');
          const encryptedToken = encryptInit.encrypt(token);

          localStorage.setItem('token', encryptedToken);
     }

Потім, перш ніж використовувати ваш маркер, розшифруйте його за допомогою PRIVATE_KEY_STORED_IN_ENV_FILE


@HassanAlthaf тут вам не вистачає суті, ніколи не буде стовідсоткового захищеного додатка, це просто так, ви зменшуєте поверхню атаки і принаймні env-файл не буде опублікований безпосередньо на github. Крім того, пакетний код буде придушеним і неправомірним, що ускладнить їх зловмисникам.
Кідалі Кевін

Приватний ключ не повинен відкриватися. Ви б скомпрометували весь API.
Хассан Алтаф

З мого досвіду Якщо ви робили речі розумно і правильно, ваш приватний ключ не буде відкритий у вашій виробничій збірці, якщо так, то скріншот для підтримки цього або навіть URL-адреси.
Кідалі Кевін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.