Как правильно избежать значения заголовка Location:? - PullRequest
0 голосов
/ 24 октября 2010

В моем веб-приложении я использую заголовки HTTP Location: для перенаправления (например, POST / redirect / GET).Но целевые местоположения должны быть динамическими (например, login.php?dest=pagexy.php).Мы все знаем, что любой изменяемый пользователем ввод должен быть правильно экранирован для предотвращения XSS, поэтому

 header('Location: '.$_REQUEST['dest']);

выглядит неправильно.Простой urlencode -ing может использоваться только для простых файлов, но не для путей (например, междоменных URL-адресов с единой регистрацией).

Я также читал об уязвимостях, таких как:

Location: javascript:...bad.stuff...  or
Location: data:text/html:base64,...

Наличие явного белого списка адресатов, вероятно, было бы наиболее безопасным решением, но оно утомительно и может быть невозможно даже для всех вариантов использования.

Решения?

Редактировать:

  1. Достаточно ли правильное urlencoding для простых файлов?Предположим, что последняя версия PHP (> 5.1.2, AFAIK) запрещает переводы строк в header ().

  2. Как я могу безопасно обрабатывать междоменную проверку учетных данных, не зная друг друга-домензаранее?

Ответы [ 2 ]

1 голос
/ 24 октября 2010

На самом деле происходит три вида атак:

  1. Разделение ответов HTTP, но, как уже упоминалось, некоторые комментарии, header () фильтрует символы CRLF.
  2. Open Redirect, который, я полагаю, не может быть уменьшен в вашем случае.
  3. XSS. urlencode () бесполезен, не беспокойтесь. Вы должны убедиться, что URL-адрес http: // (или https://), если возможно сделать перенаправление на javascript: (некоторые браузеры разрешают это, но не на все) и data: URI.

Для получения дополнительной информации об Open Redirect и его проблемах см. Презентацию на OWASP AppSec 2010 от sirdarckcat и thornmaker

1 голос
/ 24 октября 2010

Простой: НЕ ДЕЛАЙТЕ ЭТОГО.

Если вам нужно перенаправить пользователя, никогда не позволяйте ему сообщать вам, куда он направляется.

Если вам абсолютно необходимо это сделать, urlencode ввода, белый список доменов и удаление параметров, которые вы не включили в белый список. А еще лучше, не позволяйте им говорить вам, какой домен - создайте его, используя какой-либо другой серверный переключатель.

Если вы серьезно не заблокируете это, вы будете уязвимы для всех видов вещей. Будьте особенно осторожны, чтобы они не могли поставить разрыв строки там.

Подробнее:

...