2010-10-24 4 views
0

В моем webapp я использую заголовки 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,... 

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

Решения?

Edit:

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

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

ответ

1

Простой: НЕ КОГДА-ЛИБО ЭТО.

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

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

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

Подробнее:

+0

Последних версий PHP фильтр для переноса строк в заголовке(), так вот хорошо. В частности, как я могу обрабатывать прецеденты типа SSO, где я не могу заранее знать все целевые домены? – smilingthax

+1

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

+0

Существуют различные сценарии: у меня в настоящее время есть два серьезных недостатка в моем приложении, с логином и с POST/redirect/GET. Я теперь уверен, что нет решения «Location:» - only. Вместо этого мне придется использовать фиксированные цели перенаправления и/или файлы cookie. OTOH кросс-доменная вещь касается некоторых локальных веб-приложений с богатым клиентом, которые поддерживают расширенную функциональность в сочетании с удаленной учетной записью пользователей на моем сервере-приложении (что также должно быть известно о локальном приложении). Безопасность AFAICS требует, по крайней мере, явных действий со стороны пользователя, но дьявол находится в деталях. Требуется больше мышления. – smilingthax

1

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

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

Для получения дополнительной информации об открытой Redirect и ее проблемах см presentation at OWASP AppSec 2010 по sirdarckcat и thornmaker

Смежные вопросы