Почему я должен вызывать «выход» после перенаправления через заголовок («Местоположение ..») в PHP? - PullRequest
54 голосов
/ 01 мая 2010

Вы знаете, что если вы хотите перенаправить пользователя в PHP, вы можете использовать функцию заголовка:

header('Location: http://smowhere.com');

Также хорошо известно, что рекомендуется также ставить exit; после вызова header, чтобы предотвратить выполнение другого php-кода. Итак, мой вопрос: может ли код быть эффективно выполнен после вызова header-Location? В каких случаях? Может ли злонамеренный пользователь полностью игнорировать вызов header('Location..')? Как?

Ответы [ 6 ]

58 голосов
/ 01 мая 2010

Может ли код после вызова местоположения заголовка быть эффективно выполнен?

Да, всегда. header - это только строка данных , запрашивающая браузера о перенаправлении. Остальная часть страницы будет по-прежнему обслуживаться PHP и может просматриваться клиентом, просто предотвращая выполнение команды header.

Это достаточно просто сделать с клиентом командной строки, таким как wget, например, просто сказав ему, что он не следует перенаправлениям.

Итог: если вы не запретите это, PHP отправит все тело даже после вызова header. Это тело полностью доступно получателю без каких-либо специальных навыков взлома.

25 голосов
/ 01 мая 2010

Если вы перенаправляете, но не die() / exit() , код всегда выполняется и отображается .

Возьмите следующий пример:

admin.php:

if (authenticationFails)
{
    // redirect and don't die
}

// show admin stuff

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

8 голосов
/ 01 мая 2010

header() указывает PHP, что заголовок HTTP должен быть отправлен ... Когда отправляются заголовки HTTP.

И они отправляются не сразу, когда вы пишете вызов header (), но когда пришло время отправить их (обычно, когда PHP нужно начать отправку тела ответа - что может быть позже, чем Вы думаете, когда output_buffering достигнут) .

Итак, если вы просто позвоните header(), то абсолютно не гарантируется, что код, написанный после этого оператора, не будет выполнен - ​​если только вы не укажете, что это не должно, используя exit / die.

Пользователь может игнорировать заголовок Location, если хочет; но это ничего не изменит в связи с тем, что код после вызова header() может выполняться или не выполняться: это вопрос на стороне сервера.

1 голос
/ 01 мая 2010

Без вызова выхода точная точка / время, в которое ваш скрипт будет завершен, снизится до двух факторов:

  1. Как быстро клиентский браузер реагирует на перенаправление
  2. Сколько времени занимает выполнение остальной части вашего скрипта.

Допустим, браузер НЕМЕДЛЕННО запускает действие перенаправления, как только видит заголовок Location. Это означает, что он отключит соединение, с которого происходит перенаправление, поэтому он может начать соединение с новым местоположением. Как правило, это означает, что веб-сервер прервет сценарий перенаправления. Сколько бы времени ни потребовалось для перехода заголовка с сервера-> клиента, а процесс завершения соединения TCP с клиента-> сервера - это количество времени, в течение которого ваш скрипт может продолжать работать.

1 голос
/ 01 мая 2010

re: может ли код быть эффективно выполнен после вызова местоположения заголовка?

Да, если вы не закроете скрипт.

re: В каких случаях?

В каждом случае.

Может ли злонамеренный пользователь полностью игнорировать вызов заголовка ('Location ..')?

Нет, это будет взыскано, пользователь не имеет права голоса в этом вопросе.

1 голос
/ 01 мая 2010

Код PHP после запуска header (). Однако иногда это требуется, как показывает пример на php.net. Чтобы убедиться, что это не так, вы полностью прекращаете выполнение программы.

...