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

Проверка использования строгого белого списка доменов для заголовка CORS Access-Control-Allow-Origin

Описание

Это требование подразумевает, что заголовок Access-Control-Allow-Origin в ответах CORS (Cross-Origin Resource Sharing) должен использовать строгий белый список доверенных доменов и поддоменов. Это помогает предотвратить атаки, такие как межсайтовая подделка запросов (CSRF) и кража данных, ограничивая доступ к ресурсам только с доверенных источников.

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

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

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

Определение белого списка доменов: Создайте список доверенных доменов и поддоменов для заголовка Access-Control-Allow-Origin.

Пример (установка заголовка CORS в Python с использованием Flask):

from flask import Flask, request, jsonify

app = Flask(__name__)

# Определение белого списка доменов
ALLOWED_ORIGINS = ['https://trusted-domain.com', 'https://sub.trusted-domain.com']

@app.after_request
def add_cors_headers(response):
    origin = request.headers.get('Origin')
    if origin in ALLOWED_ORIGINS:
        response.headers.add('Access-Control-Allow-Origin', origin)
    return response

@app.route('/api/resource', methods=['GET'])
def api_resource():
    return jsonify({"data": "Protected resource accessed successfully."})

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

Проверка заголовка CORS на стороне клиента: Убедитесь, что запросы отправляются с правильным заголовком Origin.

Пример (отправка запроса с заголовком Origin с использованием JavaScript):

fetch('https://your-api.com/api/resource', {
    method: 'GET',
    headers: {
        'Origin': 'https://trusted-domain.com'
    }
})
.then(response => {
    if (response.ok) {
        return response.json();
    }
    throw new Error('Network response was not ok.');
})
.then(data => console.log(data))
.catch(error => console.error('Error:', error));

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

# Пример уязвимого кода на Python
@app.after_request
def add_cors_headers(response):
    # Отсутствие строгого белого списка доменов
    response.headers.add('Access-Control-Allow-Origin', '*')  # Уязвимость: разрешение всех доменов
    return response

Проблема: Использование символа * в заголовке Access-Control-Allow-Origin позволяет любому домену получать доступ к ресурсам, что увеличивает риск атак.

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

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

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

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