$_SERVER['HTTP_HOST']
フォームで使用されている場合でも、XSS攻撃を心配することなく、サイト上のすべてのリンクに使用することは「安全」ですか?
はい、それはだ、安全に使用するために$_SERVER['HTTP_HOST']
、(とさえ$_GET
と$_POST
)長いあなたがそれらを検証するようにそれらを受け入れる前に。これは私が安全な運用サーバーのために何をするかです:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$reject_request = true;
if(array_key_exists('HTTP_HOST', $_SERVER)){
$host_name = $_SERVER['HTTP_HOST'];
// [ need to cater for `host:port` since some "buggy" SAPI(s) have been known to return the port too, see http://goo.gl/bFrbCO
$strpos = strpos($host_name, ':');
if($strpos !== false){
$host_name = substr($host_name, $strpos);
}
// ]
// [ for dynamic verification, replace this chunk with db/file/curl queries
$reject_request = !array_key_exists($host_name, array(
'a.com' => null,
'a.a.com' => null,
'b.com' => null,
'b.b.com' => null
));
// ]
}
if($reject_request){
// log errors
// display errors (optional)
exit;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
echo 'Hello World!';
// ...
の利点$_SERVER['HTTP_HOST']
は、その動作がより明確に定義されていること$_SERVER['SERVER_NAME']
です。コントラスト➫➫:
Host:ヘッダーのコンテンツ(存在する場合)。
と:
現在のスクリプトが実行されているサーバーホストの名前。
より適切に定義されたインターフェースを使用する $_SERVER['HTTP_HOST']
ということは、より多くのSAPIが信頼できる明確に定義された動作を使用して実装することを意味します。(他とは異なります。)ただし、それでも完全にSAPIに依存しています➫➫:
すべてのWebサーバーがこれらの[ $_SERVER
エントリ] を提供するという保証はありません。サーバーは一部を省略したり、ここに記載されていないものを提供したりする場合があります。
ホスト名を適切に取得する方法を理解するには、何よりもまず、コードのみを含むサーバーには、ネットワーク上の自身の名前を知る手段(検証の前提条件)がないことを理解する必要があります。独自の名前を提供するコンポーネントとインターフェースする必要があります。これは次の方法で実行できます。
ローカル構成ファイル
ローカルデータベース
ハードコードされたソースコード
外部リクエスト(curl)
クライアント/攻撃者のHost:
リクエスト
等
通常は、ローカル(SAPI)構成ファイルを介して行われます。Apache➫➫などで正しく設定したことに注意してください。
動的仮想ホストを通常のホストのように見せるために、いくつかのことを「偽造」する必要があります。
最も重要なのは、Apacheが自己参照URLなどを生成するために使用するサーバー名です。これはServerName
ディレクティブで構成され、SERVER_NAME
環境変数を介してCGIで使用できます。
実行時に使用される実際の値は、UseCanonicalName設定によって制御されます。
で UseCanonicalName Off
、サーバー名の内容から来るHost:
リクエストのヘッダー。これ UseCanonicalName DNS
は、仮想ホストのIPアドレスの逆DNSルックアップから取得されます。前者の設定は名前ベースの動的仮想ホスティングに使用され、後者は** IPベースのホスティングに使用されます。
場合は何もありませんので、Apacheは、サーバー名をうまくすることはできませんHost:
ヘッダーまたは失敗したルックアップDNS 、その後で構成されている値ServerName
の代わりに使用されますが。