1. ホーム
  2. php

[解決済み] PHP $_SERVER['HTTP_HOST'] vs. $_SERVER['SERVER_NAME'], 私はマニュアルページを正しく理解しているのでしょうか?

2022-03-05 15:01:45

質問

いろいろと検索して、PHPの サーバーのドキュメント . 私のサイト全体で使用される単純なリンク定義のための私のPHPスクリプトに使用するものに関して、私はこれを正しく理解していますか?

$_SERVER['SERVER_NAME'] は、Webサーバーの設定ファイル(私の場合はApache2)に基づいており、いくつかのディレクティブによって変化します。(1) VirtualHost, (2) ServerName, (3) UseCanonicalName, など。

$_SERVER['HTTP_HOST'] は、クライアントからの要求に基づいています。

したがって、私のスクリプトを可能な限り互換性のあるものにするために使用する適切なものは、次のようになると思われます。 $_SERVER['HTTP_HOST'] . この仮定は正しいのでしょうか?

フォローアップのコメント

この記事を読んで、何人かの人たちが「quot;彼らはいかなるものも信用しない」と言ったことに気づき、私は少し誇大妄想的になったようです。 $_SERVER vars"。

どうやら議論の中心は $_SERVER['PHP_SELF'] と、XSS 攻撃を防ぐために適切なエスケープをせずにフォームの action 属性に使ってはいけない理由です。

上記の私の最初の質問に対する私の結論は、以下のようになります。 $_SERVER['HTTP_HOST'] を使用すれば、フォームで使用する場合でも、XSS 攻撃を心配することなく、サイト上のすべてのリンクに使用できます。

間違っていたら訂正してください。

解決方法は?

おそらく誰もが最初に思うことでしょう。でも、ちょっとだけ難しいんです。ご覧ください。 クリス・シフレットの記事 SERVER_NAME 対談 HTTP_HOST .

銀の弾丸はないようです。ただ、あなたが は Apache に正規の名前を使わせるために を使用すると、常に正しいサーバー名を取得することができます。 SERVER_NAME .

そのため、ホスト名をホワイトリストと照合するか、どちらかを選択します。

$allowed_hosts = array('foo.example.com', 'bar.example.com');
if (!isset($_SERVER['HTTP_HOST']) || !in_array($_SERVER['HTTP_HOST'], $allowed_hosts)) {
    header($_SERVER['SERVER_PROTOCOL'].' 400 Bad Request');
    exit;
}