Перейти к содержанию

Проверка того, что архитектура рассматривает клиентские секреты как небезопасные

Описание

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

Почему это важно

  1. Уязвимость к атакам: Секреты, хранящиеся на стороне клиента, могут быть легко извлечены с помощью инструментов для анализа трафика, XSS-атак или других методов.
  2. Защита данных: Небезопасное обращение с клиентскими секретами может привести к утечке конфиденциальной информации и несанкционированному доступу к ресурсам.
  3. Соблюдение стандартов безопасности: Многие отрасли требуют строгого обращения с конфиденциальными данными, и игнорирование этого требования может привести к юридическим последствиям.
  4. Устойчивость к атакам: Правильное обращение с секретами помогает предотвратить атаки, такие как кража токенов и доступ к защищенным ресурсам.

Способы реализации с примерами

Не храните секреты на стороне клиента: Избегайте хранения конфиденциальных данных, таких как API-ключи или токены доступа, в коде клиента или в локальном хранилище.

Пример:

// Плохо: хранение API-ключа в коде клиента
const apiKey = 'YOUR_API_KEY';  // Небезопасно

Используйте сервер для обработки секретов: Перенесите логику, связанную с секретами, на серверную сторону, чтобы минимизировать риск их утечки.

Пример:

// Хорошо: запрос к серверу для получения данных
fetch('/api/data', {
    method: 'GET',
    headers: {
        'Authorization': `Bearer ${token}`  // Токен передается на сервер
    }
});

Используйте временные токены: Если необходимо использовать токены на стороне клиента, используйте временные токены или токены с ограниченным сроком действия, которые можно легко отозвать.

Пример:

// Запрос временного токена с сервера
fetch('/api/get-temporary-token')
    .then(response => response.json())
    .then(data => {
        const tempToken = data.token;  // Используйте временный токен
    });

Регулярно обновляйте и отзывайте секреты: Реализуйте механизмы для регулярного обновления и отзыва секретов, чтобы минимизировать риски в случае их компрометации.

Пример:

# Пример на сервере: отзыв токена
@app.route('/revoke-token', methods=['POST'])
def revoke_token():
    token = request.json.get('token')
    # Логика отзыва токена
    revoke_token_in_db(token)
    return jsonify({'message': 'Token revoked successfully'}), 200

Примеры уязвимого кода

// Пример уязвимого кода на клиенте
const apiKey = 'YOUR_API_KEY';  // Хранение секретов на клиенте
fetch(`https://api.example.com/data?api_key=${apiKey}`);

Проблема: В этом коде API-ключ хранится на стороне клиента, что делает его уязвимым для кражи.

Причины, к которым может привести несоблюдение требования

  1. Кража секретов: Злоумышленники могут легко извлечь секреты, хранящиеся на стороне клиента, что может привести к несанкционированному доступу к ресурсам.
  2. Уязвимость системы: Небезопасное обращение с клиентскими секретами может привести к компрометации системы и утечке данных.
  3. Проблемы с доверием: Пользователи могут потерять доверие к системе, если они узнают о проблемах с безопасностью и утечкой данных.

Рекомендации

  • Избегайте хранения секретов на стороне клиента и перемещайте логику, связанную с секретами, на серверную сторону.
  • Используйте временные токены и механизмы для их отзыва.
  • Регулярно проверяйте код на наличие уязвимостей, связанных с клиентскими секретами.
  • Обучайте команду разработчиков о важности безопасного обращения с конфиденциальными данными.