Термин «схема оболочки/URL-адреса PHP SSRF» относится к методам, используемым для устранения уязвимостей подделки запросов на стороне сервера (SSRF) в приложениях PHP. Уязвимости SSRF позволяют злоумышленнику отправлять запросы с сервера к произвольным внешним ресурсам, что потенциально может привести к утечке данных или удаленному выполнению кода.
Вот несколько методов, обычно используемых для устранения уязвимостей SSRF в PHP:
- Белый список: создайте белый список разрешенных 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
}
- Внесение в черный список. Создайте черный список запрещенных 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
- Проверка 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
}
- Разрешение относительного 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
}