wp_sanitize_redirect()
Очищає вказану URL-адресу, щоб її можна було безпечно використовувати при редиректах.
Видалення неприпустимих символів у параметрах URL. Видаляє прогалини!
Щоб перевірити посилання редиректа, використовуйте wp_validate_redirect()
Це init .
Заміна функції (перевизначення) — у плагіні можна створити функцію з такою самою назвою, тоді вона замінить поточну функцію.
wp_kses_no_null()
wp_safe_redirect()
(швидко) | 50000 разів – 0.20 сек
(дуже швидко) |
PHP 7.1.5, WP 4.8.2
Хуків немає.
Повертає
Строку
. Очищений URL.
Використання
wp_sanitize_redirect($location);
-
$location
(рядок) (обов’язковий) - URL для перенаправлення (редиректу).
Приклади
#1 Приклад очищення шкідливого URL
$url = 'http://test.example.com/redirect.php?page=%0d%0aContent-Type: text/html%0d%0aHTTP/1.1 200 OK%0d%0aContent-Type: text/html%0d %0aContent- Length:%206%0d%0a%0d%0a%3Chtml%3EHACKED%3C/html%3E.'; echo wp_sanitize_redirect($url); //> http://test.example.com/~arpit/redirect.php?page=Content-Type:text/htmlHTTP/1.1200OKContent-Type:text/htmlContent-Length:%206%3Chtml%3EHACKED%3C/ html%3E.
#2 Зверніть увагу – функція видаляє прогалини
$url = '/inventory/certified new used/'; echo wp_sanitize_redirect($url); // /inventory/certifiednewused/
Про атаки за допомогою редиректів
Як створюється атака
Атака з редиректами здійснюється за допомогою вставки шкідливих або неприпустимих символів в URL, які під час обробки статусу 3xx (переадресації HTTP) змінюють запит і впливають на параметри заголовка HTTP “Location” або “Set-Cookie”.
Це можливо через недостатню перевірку введених даних на наявність символів: CR (повернення каретки: %0d
або r
) та LF (перехід на новий рядок: %0a
або n
).
Наприклад, так сервер може обробляти редирект:
<?php header( "Location: " . $_GET['page'] );
Далі, зломщик може використовувати послідовність символів %0d%0a для додавання в заголовок даних, аналогічних наведеним нижче:
http://test.example.com/arpit/redirect.php?page=%0d%0aContent-Type: text/html%0d%0aHTTP/1.1 200 OK%0d%0aContent-Type: text/html%0d%0aContent - Length:%206%0d%0a%0d%0a%3Chtml%3EHACKED%3C/html%3E.
У зручному форматі:
rn Content-Type: text/htmlrn HTTP/1.1 200 OKn Content-Type: text/htmlrn Content-Length: 6rn rn <html>HACKED</html>
У разі переходу жертвою атаки за даним шкідливим посиланням (скороченим за допомогою спеціальних сервісів) серверу буде відправлено наступний запит:
GET /arpit/redirect.php?page=%0d%0aContent-Type: text/html%0d%0aHTTP/1.1 200 OK%0d%0aContent-Type: text/html%0d%0aContent- Length:%206%0d%0a%0d%0a%3Chtml%3EHACKED%3C/font%3E%3C/html%3E. Host: test.example.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9) Gecko/2008052960 Firefox/3.6.2 ...... Accept-Language: en-us,en;q=0.5 Accept-Charset: ISO-8859-1, utf-8; q = 0.7, *; q = 0.7 Keep-Alive: 300 Connection: keep-alive
Сервер повинен відповісти так:
HTTP/1.1 302 Found [Перша стандартна відповідь зі статусом HTTP 302] Date: Tue, 12 Apr 2005 22:09:07 GMT Server: Apache/2.3.8 (Unix) mod_ssl/2.3.8 OpenSSL/1.0.0a Location: Content-Type: text/html HTTP/1.1 200 OK [друга відповідь на новий запит, сформований зломщиком] Content-Type: text/html Content-Length: 6 <html>HACKED</html> [Введені довільні дані відображаються як сторінка перенаправлення] Content-Type: text/html Connection: Close
Як ми можемо побачити в описі процесу обміну даними вище, сервер відправляє стандартну відповідь HTTP зі статусом 302
, але введення довільних даних у рядок запиту призводить до передачі нової відповіді HTTP зі статусом 200 OK
, що дозволяє показати введені дані жертві атаки у вигляді звичайної відповіді веб-сервера. Жертва атаки побачить веб-сторінку із текстом “HACKED”.
Схема вищеописаного:
При атаках між користувачами друга відповідь, відправлена веб-сервером, може бути помилково інтерпретована як відповідь на інший запит, можливо відправлений іншим користувачем, що використовує це ж TCP-з’єднання з сервером. У цьому випадку запит одного користувача обслуговується з використанням даних іншого користувача.
Що потрібно робити для підвищення безпеки
Вразливість між користувачами може призвести до заміни сторінок сайту за допомогою розміщення шкідливих даних у кеш сервера (Web-cache poisoning) і до можливості використання міжсайтових вразливостей сценаріїв, але такі методи підвищення безпеки дозволяють нейтралізувати її:
Пошук у всіх введених користувачами даних символів CR/LF, тобто,
rn
або%0d%0a
будь-якої іншої форми їх кодування (або інших небезпечних символів) перед використанням цих даних у будь-яких заголовках HTTP.Слід правильно форматувати рядки URI в будь-яких місцях HTTP-повідомлень, наприклад, у параметрі “Location” заголовка HTTP; після цього символи CRLF (
/r
,/n
) не будуть оброблятися браузером.- SSL (HTTPS) НЕ дозволяє протидіяти таким атакам – це міф; при використанні SSL кеш веб-браузера та з’єднання поза SSL залишаються незахищеними. Не покладайтеся на технологію SSL для захисту від типу атак.
Докладніше про атаки з розділенням відповідей HTTP читайте тут .
список змін
З версії 2.3.0 | Введено. |