#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) используя работников службы