Каким образом можно сохранить настройки сайта?

Добрый день! <br/> Подскажите, как мне правильно поступить в следующей ситуации. <br/> У меня есть бекенд на expressjs и фронтенд на nextjs. <br/> <br/> На бекенде я храню определенные настройки в текстовом файле, а во фронтенде, в админской панели, с помощью GET-запроса к API получаю данные из этого файла и отображаю их для внесения изменений. <br/> Например, в файле содержатся следующие строки: <pre><code>EnableRegister=true
Oauth=false
GOOGLE_SECRET_KEY=asndfksandklsandkasl
И другие параметры, такие как время, через которое пользователь может удалить комментарий и т.д.</code></pre> <br/> <br/> На фронтенде, чтобы использовать определенные переменные, например EnableRegister, я получаю весь файл в формате JSON и обращаюсь к интересующей строке. <br/> Это приводит к тому, что пользователь имеет доступ к полному содержимому файла через консоль, поскольку он обращается к конкретному GET API URL, который возвращает этот файл. <br/> <br/> Как мне скрыть это от пользователей? <br/> <br/> Как обычно реализуют настройки сайта, чтобы администраторы могли редактировать их через админку, а пользователи не имели доступа к полному запросу? <br/> <br/> Доставляет ли цель хранение всех этих данных в базе данных?
  • 9 декабря 2024 г. 14:53
Ответы на вопрос 3
Добрый день!

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

### 1. Хранение настроек в базе данных
Использование базы данных для хранения конфигурационных данных – это распространенная практика. Это обеспечивает контролируемый доступ к конфигурации и позволяет легко управлять данными. При этом вы можете настроить роли и права доступа таким образом, чтобы только администраторы могли изменять настройки.

### 2. Разделение конфиденциальных и публичных настроек
Если у вас есть параметры, которые не должны быть доступны пользователям (например, секретные ключи), убедитесь, что они никогда не передаются через API, доступные для пользователей. Вы можете использовать переменные окружения или конфигурационные файлы, которые загружаются только на сервере.

### 3. Аутентификация и авторизация
Реализуйте систему аутентификации и авторизации для вашего API. Убедитесь, что только хорошо аутентифицированные и авторизованные пользователи (например, администраторы) могут получить доступ к настройкам через API. Вы можете использовать JWT (JSON Web Tokens) или сессии для управления доступом.

### 4. API для администрирования
Создайте отдельный API-эндпоинт только для админов, который будет обрабатывать изменения настроек. Этот эндпоинт должен принимать только проверенные запросы от авторизованных пользователей и возвращать только те данные, которые необходимы.

### 5. Валидирование и логи
Храните логи всех изменений настроек и внедрите механизм валидации для новых значений, чтобы избежать возможных ошибок и атак (например, инъекций).

### 6. Шифрование
Для особо чувствительных данных, таких как секретные ключи, используйте шифрование. Таким образом, даже если кто-то получит доступ к данными, они не смогут их использовать без ключа шифрования.

### 7. Использование конфигурационных файлов
Для данных, которые не должны изменяться часто, вы можете использовать файл конфигурации, сохраняемый на сервере (например, `config.json` или `.env`), который будет загружаться при инициализации приложения. Такие данные можно изменять вручную при развертывании приложения.

### 8. Ограничение доступа с помощью CORS
Если ваш API работает на другом домене, помните о настройке CORS, чтобы ограничить доступ к API только из доверенных источников.

### Заключение
Хранение всех данных в базе данных – это безопасный и гибкий подход. Это позволит вам управлять настройками с помощью сложной логики аутентификации и авторизации, а также легко изменять их в интерфейсе администрирования. С учетом вышеперечисленных мер ваша система будет более защищенной от несанкционированного доступа.
Два базовых правила: 
1. Всё, что передаётся пользователю, он может увидеть.
Если не хотите, чтобы пользователь что-то видел, просто не передавайте это на фронт. Отправляйте только то, что пользователю можно видеть.
2. Всё, что приходит от пользователя требует проверки.
Если вы не хотите, чтобы пользователь мог прислать на бэк недостоверные данные, просто не принимайте их без проверки.
В обоих случаях, чтобы знать, что конкретному пользователю можно видеть и что он может прислать требуется аутентификация/авторизация как минимум для пользователей с повышенными правами.

пользователь не может увидеть весь запрос

Никак. Всё что приходит на фронт, пользователь видит. Можно конечно извратиться и шифровать ответ на сервере и расшифровывать на фронте. От простых юзеров это поможет, в девтулс будет видна зашифрованная строка. От тех кто в догадается открыть js это не поможет.
Но какой в этом смысл, ну и пусть пользователь видит, жалко что ли))
Похожие вопросы