Заголовок CORS Access-Control-Allow-Origin использует строгий белый список доверенных доменов и поддоменов для проверки
Описание
Это требование подразумевает, что заголовок CORS (Cross-Origin Resource Sharing) Access-Control-Allow-Origin
должен использовать строгий белый список доверенных доменов и поддоменов. Это помогает контролировать, какие внешние источники могут обращаться к ресурсам вашего веб-приложения, предотвращая атаки, такие как кросс-доменные запросы с недоверенных источников.
Почему это важно
- Безопасность: Строгий белый список помогает предотвратить атаки, такие как XSS (межсайтовый скриптинг) и CSRF (межсайтовая подделка запроса), ограничивая доступ к ресурсам только доверенным источникам.
- Контроль доступа: Позволяет администраторам контролировать, какие домены могут взаимодействовать с вашим приложением, что снижает риск утечек данных.
- Соблюдение стандартов безопасности: Многие организации требуют строгого контроля CORS для защиты данных и соблюдения стандартов безопасности.
- Улучшение надежности: Ограничение доступа к ресурсам только доверенным доменам может повысить стабильность и производительность приложения.
Способы реализации с примерами
Настройка заголовка Access-Control-Allow-Origin: Установите заголовок Access-Control-Allow-Origin
в ответах сервера, используя строгий белый список доверенных доменов.
Пример:
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['Access-Control-Allow-Origin'] = origin
else:
response.headers['Access-Control-Allow-Origin'] = 'null' # Запретить доступ
return response
@app.route('/data', methods=['GET'])
def get_data():
return jsonify({"message": "This is secure data."})
Использование регулярных выражений для проверки доменов: Если необходимо, можно использовать регулярные выражения для более гибкой проверки доменов.
Пример:
import re
def is_origin_allowed(origin):
allowed_pattern = re.compile(r'https://(trusted-domain\.com|sub\.trusted-domain\.com)$')
return bool(allowed_pattern.match(origin))
@app.after_request
def add_cors_headers(response):
origin = request.headers.get('Origin')
if is_origin_allowed(origin):
response.headers['Access-Control-Allow-Origin'] = origin
else:
response.headers['Access-Control-Allow-Origin'] = 'null' # Запретить доступ
return response
Логирование и мониторинг: Ведите журнал всех запросов с указанием источников, чтобы отслеживать попытки доступа с недоверенных доменов.
Пример:
import logging
logging.basicConfig(level=logging.INFO)
@app.after_request
def add_cors_headers(response):
origin = request.headers.get('Origin')
if is_origin_allowed(origin):
response.headers['Access-Control-Allow-Origin'] = origin
logging.info(f"Allowed CORS request from {origin}")
else:
response.headers['Access-Control-Allow-Origin'] = 'null' # Запретить доступ
logging.warning(f"Blocked CORS request from {origin}")
return response
Примеры уязвимого кода
# Пример уязвимого кода на Python
@app.after_request
def add_cors_headers(response):
# Отсутствие строгой проверки источника
origin = request.headers.get('Origin')
response.headers['Access-Control-Allow-Origin'] = '*' # Уязвимость к XSS и CSRF
return response
Проблема: В этом коде используется *
для разрешения всех источников, что может привести к атакам XSS и CSRF.
Причины, к которым может привести несоблюдение требования
- Уязвимость к XSS и CSRF: Неограниченный доступ может быть использован злоумышленниками для выполнения атак на пользователей.
- Проблемы с доверием: Пользователи могут потерять доверие к системе, если они столкнутся с проблемами безопасности или некорректной работой приложения.
- Проблемы с соблюдением стандартов: Несоблюдение требований по контролю доступа может привести к юридическим последствиям и штрафам.
Рекомендации
- Установите заголовок
Access-Control-Allow-Origin
с использованием строгого белого списка доверенных доменов. - Используйте регулярные выражения для более гибкой проверки доменов, если это необходимо.
- Ведите журнал всех запросов с указанием источников для мониторинга попыток доступа с недоверенных доменов.
- Регулярно проверяйте систему на наличие уязвимостей, связанных с CORS и безопасностью данных.