Методы устранения уязвимостей PHP SSRF: внесение в белый список, черный список, проверка URL-адресов и относительное разрешение URL-адресов

Термин «схема оболочки/URL-адреса PHP SSRF» относится к методам, используемым для устранения уязвимостей подделки запросов на стороне сервера (SSRF) в приложениях PHP. Уязвимости SSRF позволяют злоумышленнику отправлять запросы с сервера к произвольным внешним ресурсам, что потенциально может привести к утечке данных или удаленному выполнению кода.

Вот несколько методов, обычно используемых для устранения уязвимостей SSRF в PHP:

  1. Белый список: создайте белый список разрешенных URL-адресов или IP-адресов, к которым приложение может получить доступ. Прежде чем делать какие-либо запросы, проверьте вводимые пользователем данные по этому белому списку. Вот простой пример:
$allowedUrls = [
   'https://example.com',
   'https://api.example.com',
];
$userInput = $_GET['url'];
if (in_array($userInput, $allowedUrls)) {
   // Make the request to the validated URL
   $response = file_get_contents($userInput);
   // Process the response
} else {
   // Handle invalid URL
}
  1. Внесение в черный список. Создайте черный список запрещенных URL-адресов или IP-адресов. Проверяйте вводимые пользователем данные по этому черному списку и отклоняйте любые запросы к этим запрещенным ресурсам. Вот упрощенная иллюстрация:
$blockedUrls = [
   'https://attacker.com',
   'https://malicious-site.com',
];
$userInput = $_GET['url'];
foreach ($blockedUrls as $blockedUrl) {
   if (stripos($userInput, $blockedUrl) !== false) {
      // Handle blocked URL
   }
}
// Make the request to the validated URL
$response = file_get_contents($userInput);
// Process the response
  1. Проверка URL-адресов. Обеспечьте тщательную проверку URL-адресов, предоставленных пользователями, чтобы убедиться, что они соответствуют ожидаемым форматам. PHP предоставляет встроенные функции, такие как filter_varи регулярные выражения для проверки URL. Вот пример использования filter_var:
$userInput = $_GET['url'];
if (filter_var($userInput, FILTER_VALIDATE_URL)) {
   // Make the request to the validated URL
   $response = file_get_contents($userInput);
   // Process the response
} else {
   // Handle invalid URL
}
  1. Разрешение относительного URL-адреса. Если ваше приложение позволяет пользователям предоставлять относительные URL-адреса, перед отправкой запросов убедитесь, что разрешенный URL-адрес безопасен. Используйте такие функции, как parse_urlи realpath, чтобы разрешить и проверить URL-адрес. Вот пример:
$userInput = $_GET['url'];
$baseUrl = 'https://example.com';
$resolvedUrl = realpath(parse_url($baseUrl, PHP_URL_PATH) . '/' . $userInput);
if ($resolvedUrl && strpos($resolvedUrl, $baseUrl) === 0) {
   // Make the request to the validated URL
   $response = file_get_contents($resolvedUrl);
   // Process the response
} else {
   // Handle invalid URL
}