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

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

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

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

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

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

Да всегда. header – это только строка данных, запрашивающая переадресацию браузера. Остальная часть страницы по- прежнему будет обслуживаться 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 разрешено) .

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

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

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

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

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

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

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

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

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

Без вызова exit точная точка / время завершения вашего сценария сводится к двум факторам:

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

Скажем, браузер НЕПРАВИЛЬНО запускает действие перенаправления в тот момент, когда видит заголовок Location. Это означает, что он отключит соединение, из которого происходит перенаправление, поэтому он может начать подключение к новому местоположению. Обычно это означает, что веб-сервер завершит перенаправление сценария. Тем не менее, требуется, чтобы заголовок переходил с сервера-> клиент, а процесс завершения TCP-соединения для перехода с client-> server – это время, в течение которого ваш скрипт может продолжать работать.