これを行う唯一の安全な方法
このページの他のすべての回答には、注意が必要なセキュリティ上の影響があります。
現在のドメインを取得する唯一の保証された安全な方法
することである𝓪𝓼𝓮𝓬𝓾𝓻𝓮𝓵𝓸𝓬𝓪𝓽𝓲𝓸𝓷𝓲𝓷𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯を𝓲𝓽を𝓼𝓽𝓸𝓻𝓮。
ほとんどのフレームワークはドメインの保存を担当するため、特定のフレームワークのドキュメントを参照する必要があります。フレームワークを使用していない場合は、次の場所のいずれかにドメインを格納することを検討してください。
+ ------------------------------------------------- --- + ----------------------------------- +
| ドメインを保存する安全な方法| 使用者|
+ ------------------------------------------------- --- + ----------------------------------- +
| 設定ファイル| Joomla、Drupal / symfony |
| データベース| ワードプレス|
| 環境変数| ララヴェル|
| サービスレジストリ| Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +
以下を使用できますが、安全ではありません
ハッカーは、これらの変数に任意のドメインを出力させることができます。これにより、キャッシュポイズニングとほとんど目立たないフィッシング攻撃が発生する可能性があります。
$_SERVER['HTTP_HOST']
これにより、ハッカーによる操作に対して開かれたリクエストヘッダーからドメインが取得されます。と同じ:
$_SERVER['SERVER_NAME']
これは、Apache設定のusecanonicalnameがオフになっている場合に改善できます。その場合$_SERVER['SERVER_NAME']
、任意の値を入力することはできなくなり、安全になります。ただし、これはデフォルトではなく、一般的な設定ではありません。
一般的なシステムでは
以下は、以下のフレームワーク/システムで現在のドメインを取得する方法です。
ワードプレス
$urlparts = parse_url(home_url());
$domain = $urlparts['host'];
WordPressでURLを作成する場合は、home_urlまたはsite_url、またはその他のURL関数を使用します。
ララヴェル
request()->getHost()
このrequest()->getHost
関数はSymfonyから継承されており、2013 CVE-2013-4752にパッチが適用されて以来安全です。
Drupal
インストーラーはまだこれを安全にする処理をしていません(問題#2404259)。ただし、Drupal 8には、信頼できるホストの設定で Drupalインストールを保護するために使用できるドキュメントがあり、その後、以下を使用できます。
\Drupal::request()->getHost();
その他のフレームワーク
この回答を自由に編集して、お気に入りのフレームワークに現在のドメインを取得する方法を含めてください。その際、フレームワークが安全に動作していることを確認するのに役立つ、関連するソースコードまたはその他へのリンクを含めてください。
補遺
悪用の例:
ボットネットが誤ったホストヘッダーを使用してページを継続的にリクエストすると、キャッシュポイズニングが発生する可能性があります。結果のHTMLには、ユーザーをフィッシングできる攻撃者のWebサイトへのリンクが含まれます。最初、悪意のあるリンクはハッカーにのみ返送されますが、ハッカーが十分なリクエストを行うと、ページの悪意のあるバージョンがキャッシュに残り、そこで他のユーザーに配布されます。
ホストヘッダーに基づいてデータベースにリンクを保存すると、フィッシング攻撃が発生する可能性があります。たとえば、フォーラムのユーザープロファイルへの絶対URLを保存するとします。不正なヘッダーを使用することにより、ハッカーは自分のプロファイルリンクをクリックしたユーザーにフィッシングサイトを送信する可能性があります。
ハッカーが別のユーザーのパスワードリセットフォームに入力するときに悪意のあるホストヘッダーを使用すると、パスワードリセット中毒が発生する可能性があります。そのユーザーには、フィッシングサイトにアクセスするためのパスワードリセットリンクを含むメールが送信されます。
ここにいくつかのより悪質な例があります
追加の警告とメモ:
- usecanonicalnameがオフになっている場合は、とにかく使用され
$_SERVER['SERVER_NAME']
ていたのと同じヘッダー$_SERVER['HTTP_HOST']
がポートに追加されます。これはApacheのデフォルト設定です。あなたまたはdevopsがこれをオンにした場合、大丈夫です-ish-でも、別のチーム、または3年後の自分自身に頼り、マイナーな構成であると思われるものを-デフォルト値?これにより、セキュリティが確保されますが、この設定に依存しないように注意してください。
- ただし、Redhatはデフォルトで[ source ]のusecanonicalをオンにします。
- 仮想ホストエントリでserverAliasが使用され、エイリアスドメインが要求された場合
$_SERVER['SERVER_NAME']
、現在のドメインは返されませんが、serverNameディレクティブの値が返されます。
- serverNameを解決できない場合は、オペレーティングシステムのホスト名コマンドが代わりに使用されます[ソース]。
- ホストヘッダーが省略されている場合、サーバーはusecanonicalが[source]にあるかのように動作します。
- 最後に、ローカルサーバーでこれを悪用しようとしたところ、ホストヘッダーを偽装できませんでした。これに対処するためのApacheのアップデートがあったのか、それとも何か間違ったことをしていたのかはわかりません。いずれにしても、このヘッダーは、仮想ホストが使用されていない環境で引き続き悪用される可能性があります。
リトルラント:
この質問は、当面のセキュリティ問題について1つも言及することなく、何十万もの意見を受け取りました!このようにすべきではありませんが、スタックオーバーフローの回答が人気があるからといって、それが安全であることを意味するわけではありません。