web-dev-qa-db-ja.com

PHPでOrigin of requestを取得するにはどうすればよいですか?

誰かがsome-client.comからsome-rest.comにXHRリクエストを送信する場合、PHPでリクエストのOrigin(ドメイン名、クライアントIPではない)を取得します。

可能な解決策:

  • 多分私は$_SERVER['HTTP_Origin']を使うことができますが、それが標準かどうかはわかりません。
  • $_SERVER['HTTP_Host']$_SERVER['SERVER_NAME']などの別のヘッダーが表示されますが、実際のhostnameではなく実際のdomainが返される場合があります。
  • そして$_SERVER['REMOTE_ADDR']はクライアントIPを提供します。

PHPでドメイン名のようなリクエストのオリジンを取得する正しい方法は何ですか?

ありがとう!

MDNによる記事HTTP access control(CORS)によると:

CORS(Cross-Origin resource sharing)メカニズムで正しく機能するには、すべてのリクエストにOriginヘッダーを設定する必要があります。

Origin」リクエストヘッダーは RFC 6454 の一部であり、はそれを一部として説明しますCORSメカニズムのMDNに従ってすべてのブラウザーと互換性があります。

MDNによる説明:

Originリクエストヘッダーは、フェッチの発生元を示します。パス情報は含まれず、サーバー名のみが含まれます。 CORSリクエストとPOSTリクエストで送信されます。Refererヘッダーに似ていますが、このヘッダーとは異なり、パス全体は公開されません。

ソース: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin

MDNによる例:enter image description here

したがって、PHPを使用してXHRリクエストのOriginを取得するには、以下を使用できます:

$_SERVER['HTTP_Origin'] 

そして、直接リクエストの場合、あなたは組み合わせることができますHTTP_REFERERおよびREMOTE_ADDR like:

if (array_key_exists('HTTP_REFERER', $_SERVER)) {
    $Origin = $_SERVER['HTTP_REFERER'];
} else {
    $Origin = $_SERVER['REMOTE_ADDR'];
}

したがって、可能な最終的な解決策は次のとおりです:

if (array_key_exists('HTTP_Origin', $_SERVER)) {
    $Origin = $_SERVER['HTTP_Origin'];
}
else if (array_key_exists('HTTP_REFERER', $_SERVER)) {
    $Origin = $_SERVER['HTTP_REFERER'];
} else {
    $Origin = $_SERVER['REMOTE_ADDR'];
}

MDNは Mozilla Developer Network です。

@ trine、@ waseem-bashir、@ p0lt10n、および他の人の助けに感謝します。

18

pHPでは、$ _ SERVER ['HTTP_REFERER']を使用して取得できます。 codeigniterを使用している場合は、$ this-> agent-> is_referral()を使用してリファラーを取得できます。

1
Waseem Bashir
$_SERVER['HTTP_Origin']  // HTTP Origin header
$_SERVER['HTTP_Host']    // HTTP Host header
$_SERVER['HTTP_REFERER'] // HTTP Referer header
$_SERVER['REMOTE_ADDR']  // HTTP Client's Public IP

上記について議論しましょう$_SERVER パラメーター。

まず、XHRはクライアント側にあり、httpクライアントとバインドします。 OriginヘッダーとRefererヘッダーは必須ではないため、標準のWebブラウザー以外のクライアントでは設定されません。 Next Hostヘッダーは必須ではない場合があります。 RESTサーバーが仮想ホストを使用する場合、このヘッダーはリクエストを正しくルーティングするために必要です。ただし、このヘッダーにはクライアントに関する詳細がありません。httpクライアントの唯一の固有のものはパブリックIPです。しかし、ISPはネットワークアドレス変換またはプロキシを使用するため、これは多くのクライアントに対応します。

すべてが相対的で境界内にあるため、 [〜#〜] cors [〜#〜] のようなメカニズムがHTTP Originヘッダーに構築されています。クライアントは想定されており、標準のブラウザを使用することをお勧めします。

あなたの場合、私の意見では、Originヘッダーに依存しても問題ありません。 [〜#〜] cors [〜#〜] メカニズムを実装することができます。

1
TRiNE