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


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

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

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

6 51

6 ответов:

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

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

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

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

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

рассмотрим пример:

админ.php:

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

// show admin stuff

Если вы не убедитесь, что завершить выполнение после заголовка location пользователь получает доступ.

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

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

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

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

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

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

да, если вы не закроете сценарий.

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

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

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

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

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

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

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