web-dev-qa-db-ja.com

PHPでheader( 'Location ..')を介してリダイレクトした後、なぜ 'exit'を呼び出さなければならないのですか?

PHPでユーザーをリダイレクトする場合は、ヘッダー関数を使用できます。

_header('Location: http://smowhere.com');
_

他のphpコードの実行を防ぐために、header呼び出しの後に_exit;_を置くことも良い習慣であることもよく知られています。だから私の質問は:header-location呼び出し後のコードを効果的に実行できるでしょうか?どの場合に?悪意のあるユーザーはheader('Location..')の呼び出しを完全に無視できますか?どうやって?

54
Nicolò Martini

header-location呼び出し後のコードを効果的に実行できますか?

はい、いつも。 headerは、1行のデータaskingリダイレクトするブラウザです。ページの残りの部分まだ提供されます by PHPで、headerコマンドの実行を防ぐだけでクライアントが見ることができます。

これは、たとえばwgetのようなコマンドラインクライアントを使用する場合、リダイレクトを追跡しないように指示するだけで十分簡単です。

結論:阻止しない場合、PHPはheaderを呼び出した後でも本文全体を送信します。その本文は特別なハッキングなしで受信者に完全に利用可能ですスキル。

58
Pekka 웃

リダイレクトするが、しない場合die()/exit()コードは常に実行および表示されます

次の例を見てください。

admin.php:

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

// show admin stuff

ロケーションヘッダーeveryの後で実行を確実に終了しない場合、ユーザーがアクセスできます。

25
Alix Axel

header() instructs PHP HTTPヘッダーを送信する必要がある... HTTPヘッダーが送信されるとき。

そして、これらはheader()への呼び出しを書き込んだときにすぐに送信されるのではなく、送信するときです(通常、PHPが応答の本文の送信を開始する必要がある場合-これは、_output_buffering_が有効になっている場合)、予想よりも遅くなる可能性があります)

したがって、header()を呼び出すだけの場合は、exit/dieを使用して、このステートメントの後に記述されたコードが実行されないことを絶対に保証する必要があります。

ユーザーは、必要に応じてLocationヘッダーを無視できます。しかし、header()の呼び出し後のコードが実行される場合とされない場合があるという事実については何も変更されません。これはサーバー側の問題です。

8
Pascal MARTIN

Exit呼び出しがない場合、スクリプトが終了する正確な時点は次の2つの要素に分類されます。

  1. クライアントブラウザがリダイレクトに反応する速度
  2. 残りのスクリプトの実行にかかる時間。

ブラウザがLocationヘッダーが通過したことを確認した瞬間に、リダイレクトアクションをすぐに開始するとします。つまり、リダイレクト元の接続がシャットダウンされるため、新しい場所への接続を開始できます。これは通常、Webサーバーがリダイレクトスクリプトを終了することを意味します。ただし、ヘッダーがサーバーからクライアントに移動するのにかかる時間が長く、クライアントがサーバーから移動するTCPリンクのシャットダウンプロセスは、スクリプトが実行し続けることができる時間です。

1
Marc B

Header()の後のPHPコードが実行されます。しかし、php.netの example が示すように、それが必要になる場合もあります。そうでないことを確認するには、プログラムフローを完全に終了します。

1
Alister Bulman

re:header-location呼び出し後のコードを効果的に実行できますか?

スクリプトを閉じない場合は、はい。

re:どちらの場合ですか?

すべての場合に。

悪意のあるユーザーがheader( 'Location ..')の呼び出しを完全に無視できるか?

いいえ、それはユーザーが問題について発言権を持たないことを強要されます。

1