Проверка использования белых списков для значений заголовка Origin
Описание
Это требование подразумевает, что приложения должны использовать белые списки (whitelists) для проверки допустимых значений заголовка Origin
в HTTP-запросах. Это помогает предотвратить атаки, такие как межсайтовая подделка запросов (CSRF) и кража данных, ограничивая доступ к ресурсам только с доверенных источников.
Почему это важно
- Безопасность: Проверка заголовка
Origin
помогает предотвратить CSRF-атаки, ограничивая доступ к ресурсам вашего приложения только с доверенных доменов. - Контроль доступа: Использование белых списков позволяет точно контролировать, какие источники могут взаимодействовать с вашим API или веб-приложением.
- Соблюдение стандартов: Многие стандарты безопасности рекомендуют использовать строгие настройки для заголовков, чтобы защитить пользовательские данные.
- Устойчивость к атакам: Белые списки делают систему более устойчивой к атакам, связанным с несанкционированным доступом.
Способы реализации с примерами
Определение белого списка значений заголовка Origin: Создайте список доверенных доменов для заголовка Origin
.
Пример (проверка заголовка Origin в Python с использованием Flask):
from flask import Flask, request, abort
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)
else:
abort(403) # Доступ запрещен
return response
@app.route('/api/resource', methods=['GET'])
def api_resource():
return "Protected resource accessed successfully."
if __name__ == '__main__':
app.run()
Проверка заголовка Origin на стороне клиента: Убедитесь, что запросы отправляются с правильным заголовком 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.text();
}
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
позволяет любому домену получать доступ к ресурсам, что увеличивает риск атак.
Причины, к которым может привести несоблюдение требования
- Уязвимость к CSRF: Недостаточная проверка заголовка
Origin
может привести к тому, что злоумышленники смогут отправлять запросы от имени пользователя. - Проблемы с безопасностью данных: Неправильный ввод может повредить данные или привести к утечкам конфиденциальной информации.
- Нарушение стандартов: Несоблюдение требований по безопасности может привести к юридическим последствиям и штрафам.
Рекомендации
- Используйте строгий белый список доверенных доменов для заголовка
Origin
. - Регулярно проверяйте код на наличие уязвимостей, связанных с заголовками.
- Обучите сотрудников важности безопасного обращения с заголовками и соблюдения политики безопасности.
- Тестируйте настройки CORS, чтобы убедиться, что они работают как ожидается и не допускают несанкционированного доступа.