Заголовок CORS Access-Control-Allow-Origin
использует строгий белый список доверенных доменов и поддоменов
Описание
Это требование подразумевает, что заголовок CORS (Cross-Origin Resource Sharing) Access-Control-Allow-Origin
должен быть настроен с использованием строгого белого списка доверенных доменов и поддоменов. Это позволяет контролировать, какие внешние источники могут получать доступ к ресурсам вашего веб-приложения, что повышает безопасность и предотвращает несанкционированный доступ.
Почему это важно
- Безопасность: Строгий белый список помогает предотвратить атаки, такие как CSRF (Cross-Site Request Forgery) и XSS (Cross-Site Scripting), ограничивая доступ к ресурсам только доверенным источникам.
- Контроль доступа: Позволяет разработчикам точно определять, какие домены могут взаимодействовать с их API или ресурсами, что улучшает управление безопасностью.
- Устойчивость к атакам: Настройка CORS с использованием белого списка снижает вероятность успешных атак на приложение, так как несанкционированные домены не смогут получить доступ к ресурсам.
- Соответствие стандартам: Многие стандарты безопасности требуют строгого контроля доступа к ресурсам через 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: *
позволяет любому домену получать доступ к ресурсам, что может привести к уязвимостям.
Причины, к которым может привести несоблюдение требования
- Уязвимость к атакам: Без строгого белого списка домены могут получить доступ к ресурсам, что увеличивает риск CSRF и XSS атак.
- Потеря контроля: Отсутствие контроля над источниками запросов может привести к утечке конфиденциальной информации.
- Проблемы с соответствием: Несоблюдение стандартов безопасности может привести к юридическим последствиям и штрафам.
Рекомендации
- Убедитесь, что заголовок
Access-Control-Allow-Origin
настроен с использованием строгого белого списка доверенных доменов. - Регулярно проверяйте и обновляйте белый список в соответствии с изменениями в архитектуре приложения.
- Проводите аудит кода и конфигураций серверов на предмет отсутствия строгого контроля доступа через CORS.
- Обучите команду разработчиков важности использования белых списков для повышения безопасности приложения.