|
@@ -18,6 +18,33 @@ function getSafeRedirectUrl(string $default = '/'): string {
|
|
|
return $default;
|
|
return $default;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Проверяем:
|
|
|
|
|
+ // 1. Начинается с /, не содержит //, ~, %00
|
|
|
|
|
+ // 2. Разрешённые символы: a-z, 0-9, -, _, /, ?, =, &, .
|
|
|
|
|
+ // 3. Допустимые форматы:
|
|
|
|
|
+ // - /path/ (слэш на конце)
|
|
|
|
|
+ // - /path (без слэша)
|
|
|
|
|
+ // - /file.html (только .html)
|
|
|
|
|
+ // - /script.php (только .php)
|
|
|
|
|
+ // - Любой вариант с параметрами (?id=1)
|
|
|
|
|
+ if (!preg_match(
|
|
|
|
|
+ '/^\/' // Начинается с /
|
|
|
|
|
+ . '(?!\/)' // Не //
|
|
|
|
|
+ . '[a-z0-9\-_\/?=&.]*' // Разрешённые символы
|
|
|
|
|
+ . '(?:\/' // Варианты окончаний:
|
|
|
|
|
+ . '|\.(html|php)(?:\?[a-z0-9\-_=&]*)?' // .html/.php (+ параметры)
|
|
|
|
|
+ . '|(?:\?[a-z0-9\-_=&]*)?' // Или параметры без расширения
|
|
|
|
|
+ . ')$/i',
|
|
|
|
|
+ $decodedUrl
|
|
|
|
|
+ )) {
|
|
|
|
|
+ return $default;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Дополнительная защита: явно блокируем /config/, /vendor/ и т.д.
|
|
|
|
|
+ if (preg_match('/(^|\/)(cfg|inc|log|sessions|tmp)(\/|$)/i', $decodedUrl)) {
|
|
|
|
|
+ return $default;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
return $url;
|
|
return $url;
|
|
|
}
|
|
}
|
|
|
|
|
|