Как я могу обнаружить / избежать обновлений моего кэшированного приложения на основе React? Или как я могу обнаружить недействительность кэша до того, как это произойдет?

#javascript #reactjs #security #caching #cache-invalidation

#javascript #reactjs #Безопасность #кэширование #недействительность кэша

Вопрос:

Я разрабатываю приложение в React, которое выполняет шифрование на стороне клиента и отправляет зашифрованный контент обратно на сервер для безопасного хранения (например, подумайте об онлайн-кошельках). Это работает хорошо, поскольку данные защищены на случай, если кто-то злонамеренный получит доступ к данным. Однако, в случае, если хакер получит доступ к серверу и изменит фактический код React для отправки данных обратно в формате raw, а не в зашифрованном виде, это приведет к сбою всей системы.

Итак, как я могу заставить приложение React кэшировать только один раз, а затем в любое время в будущем, прежде чем оно запустит новую версию приложения, оно предупредит пользователя, что «доступно новое обновление и что им нужно проверить Twitter и / или GitHub для обеспечения достоверности»?

В основном мне нужно обнаружить попытки «аннулирования кэша» до того, как они произойдут, и предупредить пользователя. Как я мог это сделать?

Комментарии:

1. Это хороший вариант использования для работника службы

2. Если вы создали свое приложение с помощью Create-React-App, уже должно быть serviceworker.js файл в вашем каталоге src

3. это так, и да, я хочу использовать service workers, но нет способа защитить от обновленного контента, не так ли? Я хочу, чтобы пользователь мог сказать «не обновлять, даже если есть новый контент», потому что это потенциально может быть опасно

4. Что-то в этом мне кажется странным, как будто вы беспокоитесь, действительно ли интерфейс должен «доверять» серверной части. Похоже, вы пытаетесь сделать кэширование частью вашего подхода к решению этой проблемы с доверием. Если у вас есть основания полагать, что ваш сервер является большой целью, я бы предложил настроить надежную систему безопасности вокруг этого, чтобы вы могли отслеживать / обнаруживать вторжение.

5. Также я не понимаю, как кэширование защитит от случая, когда приложение впервые загружается браузером ПОСЛЕ взлома сервера. Нет кэша для аннулирования, поэтому он будет доверять по умолчанию, даже если он скомпрометирован.

Ответ №1:

Пара вариантов, которые вы могли бы рассмотреть:

  • Установите object.freeze() в своем кэше после первой загрузки данных, а затем используйте try/catch для обнаружения другой попытки записи в него.

  • Создайте прокси объекта

 const cache = Proxy({
  isSet: false,
  data: {}
}, {
  set(obj, prop, value) {
    if (prop === 'isSet') throw new ReferenceError()
    if (obj.isSet) throw new Error('Cache already set')
    obj.isSet = true
    return Reflect.set(...arguments)
  }
})
  

Комментарии:

1. Это хороший ответ, но его следует улучшить, добавив комментарии из основного потока, т.Е. (1) Используя страницы GitHub и, таким образом, передавая проблему доверия на github и (2) используя работников службы