Должен ли я использовать файлы cookie в моем веб-приложении? - PullRequest
0 голосов
/ 07 апреля 2020

Я создаю интернет-магазин, использующий интерфейс реакции, подключенный к express интерфейсу. Мне нужен был способ сохранения состояния, чтобы я мог отслеживать текущего пользователя и его корзину, чтобы я внедрил файлы cookie в приложение. Но, подумав, я решил вместо этого использовать локальное хранилище, потому что никакая информация, которая хранится, не должна отправляться на сервер. Существуют ли какие-либо уязвимости безопасности, связанные с неиспользованием файлов cookie, или я в порядке, просто используя локальное хранилище?

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Но, подумав, я решил вместо этого использовать локальное хранилище, поскольку никакая хранимая информация не должна отправляться на сервер.

Вы приняли это решение Совершенно правильно!

Помимо того, что с ним проще работать, локальное хранилище немного более безопасно и эффективно, поскольку вы не отправляете дополнительные данные с каждым запросом.

Вы куки нужны только в том случае, если вы так идентифицируете сеанс. В наши дни, когда большая часть сайтов работает на стороне клиента, а только вызовы API являются динамическими c, необходимость в файлах cookie меньше.

0 голосов
/ 07 апреля 2020

Файлы cookie уязвимы для определенного типа c атаки, известного как подделка межсайтовых запросов (CSRF). Я не буду go вдаваться в подробности, так как кажется, что вы не будете использовать куки, но пример обычной атаки с использованием CSRF - это вставка формы, которая автоматически отправляет данные на одну из ваших конечных точек API сторонним лицам. сайт. Если вы используете сеансы на основе cook ie (а также не используете токен CSRF в своих запросах API), этот сторонний сайт теперь может отправлять запросы API от имени вашего пользователя, если они посещают эту страницу.

Если вы собираетесь использовать локальное хранилище, вы можете забыть о любых проблемах CSRF, связанных с использованием файлов cookie. При использовании локального хранилища ваша основная задача должна касаться атак XSS (межсайтовый скриптинг). Если вы используете в своем приложении React следующее:

<div dangerouslySetInnerHTML={{__html: title}}></div>

и значение title - это то, что вы загрузили с сервера, тогда вы можете рискнуть вставить тег, который затем может получить доступ к содержимому localStorage.

Вы всегда должны быть обеспокоены потенциальными уязвимостями XSS, поскольку они допускают целый ряд атак. Что касается вашего вопроса, хотя, в частности, если вы хотите хранить что-то чувствительное в корзине пользователя (может быть, какую-либо личную информацию или номер кредитной карты) в локальном хранилище, уязвимость XSS даст злоумышленнику доступ к этим данным.

Вы можете узнать больше об уязвимостях XSS здесь .

Редактировать (ответ на вопрос автора в комментариях):
Скажем, например, вы загружаете имя пользователя пользователя из базы данных, а затем вы хотите отобразить его на веб-интерфейсе. Перед возвратом имени пользователя вы должны убедиться, что значение, которое вы загружаете из базы данных, содержит только значения, допустимые для имени пользователя (в данном случае, скажем, букв и пробелов). Вы можете использовать регулярное выражение и функцию .match(), чтобы проверить, содержит ли имя пользователя только допустимые символы:

if(username.match(/[A-Za-z ]+/)) {
  // all good!
} else {
  // there was an invalid character
}

Следует ли санировать ВСЕ текстовые данные, поступающие из базы данных? Это, вероятно, будет неэффективно для любого выбранного текстового поля. Однако, если вы будете выводить эти данные непосредственно в DOM с помощью опасных наборов HTML, то было бы неплохо сначала очистить их.

...