Конфигурация веб-сервера или сервера приложений с белым списком ресурсов или систем для отправки запросов
Описание
Это требование подразумевает, что веб-сервер или сервер приложений должен быть настроен с использованием белого списка (allow list) ресурсов или систем, к которым он может отправлять запросы. Это помогает ограничить доступ к внешним системам и ресурсам, предотвращая несанкционированные или вредоносные запросы.
Почему это важно
- Безопасность: Белый список помогает предотвратить атаки, такие как SSRF (Server-Side Request Forgery), когда злоумышленник может заставить сервер отправить запросы на нежелательные или вредоносные адреса.
 - Контроль доступа: Позволяет администраторам контролировать, к каким ресурсам может обращаться сервер, что снижает риск утечек данных.
 - Соблюдение стандартов безопасности: Многие организации требуют использования белых списков для защиты от несанкционированного доступа к системам.
 - Улучшение надежности: Ограничение запросов к известным и проверенным ресурсам может повысить стабильность и производительность приложения.
 
Способы реализации с примерами
Использование белого списка URL-адресов: Реализуйте проверку URL-адресов перед отправкой запросов, чтобы убедиться, что они находятся в белом списке.
Пример:
import requests
# Белый список разрешенных URL
ALLOWED_URLS = [
    "https://api.example.com",
    "https://service.example.com"
]
def is_url_allowed(url):
    return any(url.startswith(allowed_url) for allowed_url in ALLOWED_URLS)
def fetch_data(url):
    if not is_url_allowed(url):
        raise ValueError("URL is not allowed.")
    response = requests.get(url)
    return response.json()
# Пример использования
try:
    data = fetch_data("https://api.example.com/data")
    print(data)
except ValueError as e:
    print(e)
Использование прокси-сервера: Настройте прокси-сервер, который будет фильтровать запросы и разрешать только те, которые находятся в белом списке.
Пример:
from flask import Flask, request, jsonify
app = Flask(__name__)
ALLOWED_URLS = [
    "https://api.example.com",
    "https://service.example.com"
]
@app.route('/proxy', methods=['POST'])
def proxy_request():
    url = request.json.get('url')
    if not is_url_allowed(url):
        return jsonify({'error': 'URL is not allowed.'}), 403
    response = requests.get(url)
    return jsonify(response.json()), response.status_code
Логирование и мониторинг: Ведите журнал всех запросов, отправленных на внешние ресурсы, и любых ошибок, связанных с доступом.
Пример:
import logging
logging.basicConfig(level=logging.INFO)
def fetch_data(url):
    if not is_url_allowed(url):
        logging.warning(f"Blocked request to {url}")
        raise ValueError("URL is not allowed.")
    response = requests.get(url)
    logging.info(f"Fetched data from {url}")
    return response.json()
Примеры уязвимого кода
# Пример уязвимого кода на Python
def fetch_data(url):
    # Отсутствие проверки URL
    response = requests.get(url)  # Уязвимость к SSRF
    return response.json()
Проблема: В этом коде отсутствует проверка URL, что может привести к атакам SSRF и другим уязвимостям.
Причины, к которым может привести несоблюдение требования
- Уязвимость к SSRF: Неограниченные запросы могут быть использованы злоумышленниками для доступа к внутренним системам или ресурсам.
 - Проблемы с доверием: Пользователи могут потерять доверие к системе, если они столкнутся с проблемами безопасности или некорректной работой приложения.
 - Проблемы с соблюдением стандартов: Несоблюдение требований по контролю доступа может привести к юридическим последствиям и штрафам.
 
Рекомендации
- Реализуйте белый список URL-адресов для контроля доступа к внешним ресурсам.
 - Используйте прокси-сервер для фильтрации запросов и разрешения только тех, которые находятся в белом списке.
 - Ведите журнал всех запросов к внешним ресурсам и ошибок, связанных с доступом.
 - Регулярно проверяйте систему на наличие уязвимостей, связанных с отправкой запросов и безопасностью данных.