Вы знаете, что, если Вы хотите перенаправить пользователя в PHP, можно использовать функцию заголовка:
header('Location: http://smowhere.com');
Также известно, что это - хорошая практика для помещения также exit;
после header
звоните, для предотвращения выполнения другого кода php. Таким образом, мой вопрос: мог код после вызова местоположения заголовка быть эффективно выполненным? В которых случаях? Может злонамеренный пользователь смочь полностью проигнорировать header('Location..')
звонить? Как?
может ли код после вызова определения местоположения заголовка быть эффективно выполнен?
Да, всегда. Заголовок
- это всего лишь строка данных , запрашивающая браузер выполнить перенаправление. Остальная часть страницы будет по-прежнему обслуживаться PHP и может быть просмотрена клиентом, просто запретив выполнение команды header
.
Это достаточно просто сделать с помощью клиента командной строки, такого как wget
, например, просто указав ему не выполнять перенаправления.
Итог: Если вы не предотвратите это, PHP будет отправлять все тело сообщения даже после вызова header
. Это тело полностью доступно получателю без каких-либо специальных навыков взлома.
Если вы перенаправляете, но не die()
/ exit()
код всегда выполняется и отображается.
Возьмем следующий пример:
admin.php:
if (authenticationFails)
{
// redirect and don't die
}
// show admin stuff
Если вы не убедитесь, что завершите выполнение после заголовка местоположения каждый пользователь получит доступ.
header()
инструктирует PHP о том, что заголовок HTTP должен быть отправлен... Когда http-заголовки отправляются.
И они отправляются не сразу, когда вы пишете вызов header(), а когда пришло время отправить их (как правило, когда PHP нужно начать отправку тела ответа - что может быть позже, чем вы думаете, когда output_buffering
enabed).
Таким образом, если вы просто вызовете header()
, нет абсолютной гарантии, что код, написанный после этого оператора, не будет выполнен - если вы не укажете, что он не должен, используя exit
/die
.
Пользователь может игнорировать заголовок Location
, если захочет; но это ничего не изменит в том, что код после вызова header()
может быть выполнен или не выполнен: это на стороне сервера.
Без вызова выхода точный момент / время, когда ваш скрипт завершится, будет зависеть от двух факторов:
Допустим, браузер НЕМЕДЛЕННО запускает действие перенаправления в тот момент, когда видит, что заголовок Location проходит. Это означает, что он отключит соединение, из которого происходит перенаправление, чтобы он мог начать подключаться к новому местоположению.Обычно это означает, что веб-сервер прекратит выполнение сценария перенаправления. Сколько бы времени ни потребовалось, чтобы заголовок перешел от сервера к клиенту, а процесс отключения TCP-соединения перешел от клиента к серверу, - это время, в течение которого ваш скрипт может продолжать работать.
Php Code после header() будет запущен. Иногда это требуется, как показывает пример на php.net. Чтобы убедиться, что это не так, вы полностью завершите поток программы.
re: может ли код после вызова header-location быть эффективно выполнен?
Да, если вы не закроете скрипт.
re: В каких случаях?
Во всех случаях.
Может ли злоумышленник полностью игнорировать вызов заголовка («Местоположение ...»)?
Нет, он будет взыскиваться, и пользователь не имеет права голоса в этом вопросе.