В моем 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:
ли urlencoding достаточно/правильно для простых файлов? Предположим, что в последней версии PHP (> 5.1.2, AFAIK) запрещена новая строка в header().
Как я могу безопасно обрабатывать междоменные учетные данные без предварительного уведомления друг друга?
Последних версий PHP фильтр для переноса строк в заголовке(), так вот хорошо. В частности, как я могу обрабатывать прецеденты типа SSO, где я не могу заранее знать все целевые домены? – smilingthax
Передайте вашему приложению хэш из исходной функции и сопоставьте хэш для отправки заголовка. Похоже, вы пытаетесь сделать что-то принципиально небезопасное по дизайну, а не просто технически сложно. Вы должны указать нам, что именно вы хотите сделать. –
Существуют различные сценарии: у меня в настоящее время есть два серьезных недостатка в моем приложении, с логином и с POST/redirect/GET. Я теперь уверен, что нет решения «Location:» - only. Вместо этого мне придется использовать фиксированные цели перенаправления и/или файлы cookie. OTOH кросс-доменная вещь касается некоторых локальных веб-приложений с богатым клиентом, которые поддерживают расширенную функциональность в сочетании с удаленной учетной записью пользователей на моем сервере-приложении (что также должно быть известно о локальном приложении). Безопасность AFAICS требует, по крайней мере, явных действий со стороны пользователя, но дьявол находится в деталях. Требуется больше мышления. – smilingthax