PHP, как санировать URL для перенаправления - PullRequest
0 голосов
/ 25 сентября 2018

Я там

Я создаю экран входа в систему, и у него есть функция возврата на определенную страницу.Например, предположим, что я работаю над

/ invoice / insert.php? Id = 20

, если сеанс истекает, то система перенаправляется на

login.php? BackUrl = / invoice / insert.php? Id = 20

где backUrl - URL-адрес для перенаправления, когда пользователь запускаетновый сеанс.

Прямо сейчас я очищаю backUrl, если:

  1. , если он содержит слово http: или https:, тогда весь URL отбрасывается.
  2. если оно содержит слово ... тогда оно также отбрасывается.

Проверка подлинности выполняется каждой страницей, поэтому мне не нужно защищать, если кто-то пытается обойти защиту

login.php? BackUrl = / adminpanel / users.php

Я что-то пропустил?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

вы можете использовать это регулярное выражение: ^(?!http|\.\.).+, чтобы определить, не начинается ли строка с: 'http' или '..'

Но это небезопасно, я рекомендую вам перехватить любой URL, который выглядит как: ^\/\w+

Пример: /something

этот следующий код делает трюк:

function isSafeParam($url) {
    return (bool) preg_match('#^\/\w+#',$url);
}

foreach(["/adminpanel/users.php","http://google.com","../miss/","./dl","//google.com","/my-page"] as $url) {
    var_dump(isSafeParam($url));
}

Пример онлайн

0 голосов
/ 25 сентября 2018

Вот как я бы решил эту проблему.

  1. Иметь белый список доменов, которые являются приемлемыми.(может быть только один)
  2. Используйте правильный преобразователь URL-адресов, чтобы расширить относительные URL-адреса перенаправления до их абсолютных
  3. Синтезируйте полученный URL-адрес и посмотрите, находится ли домен в вашем белом списке.

Или: найдите анализатор URL-адресов, который может просто сказать вам, является ли URL-адрес относительным или нет.

Использование библиотеки, которая понимает URL-адреса, лучше, чем ваш собственный специальный хакер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...