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

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

Описание

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

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

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

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

Использование серверной аутентификации: Вместо хранения секретов на клиенте, используйте серверную аутентификацию для получения токенов доступа.

Пример (использование серверной аутентификации с помощью Flask):

from flask import Flask, request, jsonify
import jwt

app = Flask(__name__)
SECRET_KEY = 'your_secret_key'

@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username')
    password = request.json.get('password')

    # Логика проверки учетных данных пользователя
    if username == 'user' and password == 'pass':
        token = jwt.encode({'user': username}, SECRET_KEY, algorithm='HS256')
        return jsonify({'token': token})

    return jsonify({'message': 'Invalid credentials'}), 401

@app.route('/protected', methods=['GET'])
def protected():
    token = request.headers.get('Authorization').split()[1]
    try:
        jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
        return jsonify({'message': 'Access granted'})
    except jwt.ExpiredSignatureError:
        return jsonify({'message': 'Token expired'}), 401
    except jwt.InvalidTokenError:
        return jsonify({'message': 'Invalid token'}), 401

if __name__ == '__main__':
    app.run()

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

Пример (использование временных токенов):

@app.route('/refresh_token', methods=['POST'])
def refresh_token():
    refresh_token = request.json.get('refresh_token')

    # Логика проверки refresh_token
    if refresh_token_is_valid(refresh_token):
        new_token = jwt.encode({'user': 'user'}, SECRET_KEY, algorithm='HS256')
        return jsonify({'token': new_token})

    return jsonify({'message': 'Invalid refresh token'}), 401

Использование безопасных хранилищ: Если необходимо хранить секреты на клиенте, используйте безопасные хранилища, такие как Keychain на iOS или Keystore на Android.

Пример (использование Secure Storage в React Native):

import AsyncStorage from '@react-native-async-storage/async-storage';

const storeToken = async (token) => {
    try {
        await AsyncStorage.setItem('userToken', token);
    } catch (e) {
        // Ошибка при сохранении токена
    }
};

const getToken = async () => {
    try {
        const token = await AsyncStorage.getItem('userToken');
        return token;
    } catch (e) {
        // Ошибка при получении токена
    }
};

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

// Пример уязвимого кода на JavaScript
const apiKey = 'your_api_key'; // Хранение API-ключа на клиенте

fetch('https://api.example.com/data', {
    method: 'GET',
    headers: {
        'Authorization': `Bearer ${apiKey}`
    }
})
.then(response => response.json())
.then(data => console.log(data));

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

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

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

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

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