Разработка на PHP: Как реализовать метод isUrlSafe для проверки ссылок на наличие вредоносных редиректов?
Проверка URL на наличие вредоносных редиректов — важная задача безопасности веб-приложений. Метод `isUrlSafe` должен анализировать ссылку по нескольким критериям и возвращать булево значение.
## Базовая реализация метода isUrlSafe
php
function isUrlSafe(string $url): bool {
// 1. Проверка формата URL
if (!filter_var($url, FILTER_VALIDATE_URL)) {
return false;
}
$parsed = parse_url($url);
// 2. Разрешаем только http и https
if (!isset($parsed[‘scheme’]) || !in_array($parsed[‘scheme’], [‘http’, ‘https’])) {
return false;
}
// 3. Проверка хоста по чёрному списку
$blacklist = [‘malicious.com’, ‘phishing-site.ru’, ‘evil.net’];
if (isset($parsed[‘host’]) && in_array(strtolower($parsed[‘host’]), $blacklist)) {
return false;
}
// 4. Проверка на открытый редирект (open redirect)
if (isOpenRedirect($url)) {
return false;
}
// 5. Проверка через Google Safe Browsing API
return checkGoogleSafeBrowsing($url);
}
## Проверка на открытый редирект
Открытый редирект — уязвимость, при которой злоумышленник подставляет в параметр URL внешнюю ссылку:
php
function isOpenRedirect(string $url): bool {
$dangerousParams = [‘redirect’, ‘url’, ‘next’, ‘return’, ‘goto’, ‘dest’, ‘destination’];
$query = [];
parse_str(parse_url($url, PHP_URL_QUERY) ?? », $query);
foreach ($dangerousParams as $param) {
if (isset($query[$param])) {
$redirectTarget = $query[$param];
$parsed = parse_url($redirectTarget);
// Если параметр содержит внешний хост — это потенциальный open redirect
if (isset($parsed[‘host’])) {
return true;
}
}
}
return false;
}
## Проверка через Google Safe Browsing API
php
function checkGoogleSafeBrowsing(string $url): bool {
$apiKey = ‘YOUR_API_KEY’;
$endpoint = «https://safebrowsing.googleapis.com/v4/threatMatches:find?key={$apiKey}»;
$body = json_encode([
‘client’ => [‘clientId’ => ‘myapp’, ‘clientVersion’ => ‘1.0’],
‘threatInfo’ => [
‘threatTypes’ => [‘MALWARE’, ‘SOCIAL_ENGINEERING’, ‘UNWANTED_SOFTWARE’],
‘platformTypes’ => [‘ANY_PLATFORM’],
‘threatEntryTypes’ => [‘URL’],
‘threatEntries’ => [[‘url’ => $url]]
]
]);
$ch = curl_init($endpoint);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [‘Content-Type: application/json’]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
// Если совпадений нет — URL безопасен
return empty($result[‘matches’]);
}
## Дополнительные меры защиты
— **Белый список доменов**: разрешайте только известные доверенные домены.
— **Нормализация URL**: приводите URL к каноническому виду перед проверкой (декодирование процентов, удаление дублирующихся слешей).
— **Проверка IP-адресов**: блокируйте ссылки на внутренние IP (127.0.0.1, 192.168.x.x, 10.x.x.x) для защиты от SSRF.
— **Ограничение редиректов**: при выполнении HTTP-запроса ограничивайте количество редиректов через `CURLOPT_MAXREDIRS`.
— **Логирование**: фиксируйте все подозрительные URL для последующего анализа.
Комплексный подход с несколькими уровнями проверки значительно снижает риск пропуска вредоносных ссылок.
