PHP-безопасность для внедрения заголовка местоположения через $ _GET - PullRequest
3 голосов
/ 22 мая 2009

У меня есть код на моей странице:

header("Location: $page");

$ page передается в скрипт как переменная GET, нужна ли мне защита? (если так, то что)

Я собирался просто использовать addlashes (), но это заполнило бы URL ...

Ответы [ 4 ]

8 голосов
/ 22 мая 2009

I может пересылать ваших пользователей в любое место I , например, если я заставлю их щелкнуть ссылку, что, безусловно, является серьезным недостатком безопасности (Пожалуйста, войдите на www .yoursite.com? страница = badsite.com). Теперь подумайте о сценарии, в котором badsite.com выглядит точно так же, как ваш сайт, за исключением того, что он отслеживает учетные данные вашего пользователя.

Вам лучше определить массив $urls в своем коде и передать только индекс для записи в этом массиве, например:

$urls = array(
    'pageName1' => '/link/to/page/number/1',
    'pageNumber2' => '/link/to/page/number/2',
    'fancyPageName3' => '/link/to/page/number/3',
);
# Now your URL can look like this:
# www.yoursite.com?page=pageName1
3 голосов
/ 22 мая 2009

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

Но одно из самых важных правил - если не даже самое важное правило - это:

Никогда не доверяйте данным пользователя!

Таким образом, вы должны проверить, какое значение было передано, и проверить его. Даже если уязвимость , связанная с внедрением заголовка, была исправлена ​​в PHP 4.4.2 и 5.1.2 соответственно , вы все равно можете ввести любой действительный URI, и пользователь, который его вызывает, будет перенаправлен на него. Даже такой загадочный, как ?page=%68%74%74%70%3a%2f%2f%65%76%69%6c%2e%65%78%61%6d%70%6c%65%2e%63%6f%6d%2f какой URL закодирован для ?page=http://evil.example.com/.

2 голосов
/ 22 мая 2009

Да, вы делаете. То, что вы или я не можем сразу придумать, как воспользоваться этим небольшим кусочком кода, не означает, что более умный человек не может. Что вы хотите сделать, это убедиться, что перенаправление идет на страницу, которую вы считаете доступной. Даже эта простая проверка может работать:

$safe_pages = array('index.php', 'login.php', 'signup.php');
if (in_array($page, $safe_pages)) {
  header("Location: $page");
}
else {
  echo 'That page is not accessible.';
}
0 голосов
/ 22 мая 2009

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

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