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

Заголовок CORS Access-Control-Allow-Origin использует строгий белый список доверенных доменов и поддоменов

Описание

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

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

  1. Безопасность: Строгий белый список помогает предотвратить атаки, такие как CSRF (Cross-Site Request Forgery) и XSS (Cross-Site Scripting), ограничивая доступ к ресурсам только доверенным источникам.
  2. Контроль доступа: Позволяет разработчикам точно определять, какие домены могут взаимодействовать с их API или ресурсами, что улучшает управление безопасностью.
  3. Устойчивость к атакам: Настройка CORS с использованием белого списка снижает вероятность успешных атак на приложение, так как несанкционированные домены не смогут получить доступ к ресурсам.
  4. Соответствие стандартам: Многие стандарты безопасности требуют строгого контроля доступа к ресурсам через CORS.

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

Настройка заголовка Access-Control-Allow-Origin: Убедитесь, что ваш сервер отправляет заголовок с белым списком доверенных доменов.

Пример реализации в веб-приложении (Python с Flask):

from flask import Flask, request, make_response

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('/api/data')
def get_data():
    return {"message": "This is secure data."}

if __name__ == '__main__':
    app.run(ssl_context='adhoc')  # Для тестирования с HTTPS

Настройка заголовка на уровне сервера: Убедитесь, что ваш веб-сервер (например, Nginx или Apache) настроен для добавления заголовка Access-Control-Allow-Origin.

Пример (Nginx):

server {
    listen 443 ssl;
    server_name example.com;

    location /api/ {
        if ($http_origin ~* (https://trusted-domain.com|https://sub.trusted-domain.com)) {
            add_header Access-Control-Allow-Origin $http_origin;
        }
        # Другие настройки
    }
}

Пример (Apache):

<VirtualHost *:443>
    ServerName example.com

    <Location /api/>
        Header set Access-Control-Allow-Origin "https://trusted-domain.com"
        Header set Access-Control-Allow-Origin "https://sub.trusted-domain.com"
    </Location>

    DocumentRoot /var/www/html
</VirtualHost>

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

# Пример уязвимого кода на Python
from flask import Flask

app = Flask(__name__)

@app.after_request
def add_cors_headers(response):
    # Уязвимость: отсутствие строгого контроля доступа
    response.headers['Access-Control-Allow-Origin'] = '*'  # Разрешить доступ с любого домена
    return response

@app.route('/api/data')
def get_data():
    return {"message": "This is secure data."}

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

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

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

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

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

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