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

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

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

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

54
задан Nicolò Martini 30 April 2010 в 10:24
поделиться

6 ответов

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

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

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

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

58
ответ дан 7 November 2019 в 08:00
поделиться

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

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

admin.php:

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

// show admin stuff

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

25
ответ дан 7 November 2019 в 08:00
поделиться

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

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

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

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

8
ответ дан 7 November 2019 в 08:00
поделиться

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

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

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

1
ответ дан 7 November 2019 в 08:00
поделиться

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

1
ответ дан 7 November 2019 в 08:00
поделиться

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

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

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

Во всех случаях.

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

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

1
ответ дан 7 November 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: