Почему мне нужно вызывать "exit" после перенаправления через заголовок ( "Location.." ) в PHP?

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

admin.php:

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

// show admin stuff

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

Ответ 3

header() инструктирует PHP о необходимости отправки HTTP-заголовка... Когда отправляются заголовки HTTP.

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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

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

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

Ответ 6

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

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

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