最初はサイト全体で有効にすることなく、ブログでHSTSポリシーを試してみたいと思います。 HSTSポリシーは単なるHTTP応答ヘッダーなので、次のようにヘッダーをPHPで送信すると問題が発生します。
header("strict-transport-security: max-age=600");
サイトはすべてのhttp://リクエストをhttps://にリダイレクトしますが、これにより、HSTSヘッダーがhttp://経由で送信される可能性が高くなりますが、そうするべきではありません。ただし、HSTSに準拠するには、ユーザーエージェントはhttp://経由で配信されたHSTSポリシーを無視する必要があります。これは、悪意を持って挿入された可能性があるためです。これはテスト目的のためだけなので、とにかく心配しすぎていません。
これにより、特定のページにのみヘッダーを発行し、他のユーザーに影響を与えることなく自分にのみ公開することができます。次のようにHSTSポリシーを無効にする別のページを用意することもできます。
header("strict-transport-security: max-age=0");
これが成功することを証明する必要がありますか?このような方法でHSTSポリシーを発行することで見られる問題はありますか?おそらく、共有ホスティングを使用しているユーザーや、応答ヘッダーを構成するためのアクセス/知識がないユーザーでも、この方法でHSTSを実装できます。
HSTSは、HTTPS応答からstrict-transport-security
ヘッダーを返すことで有効になります-これがPHPで設定されているか、サーバーで設定されているか、ロードバランサーで設定されているかは、HTTPS経由で有効なヘッダーを受信する限り、ブラウザでは考慮されません。 HSTSが有効になります。
テストのためにも、単一ページからこのヘッダーを返すだけで問題ありません。 RFC 6797 状態
UAがセキュリティで保護されたチャネルを介して既知のHSTSホストからHTTP応答を受信したが、応答にSTSヘッダーフィールドがない場合、UAは既知のHSTSホストとしてそのホストを既知のマックスエージ値まで、引き続きホストを既知のHSTSホストとして扱う必要があります。 HSTSホストに到達しました。
そのため、ヘッダーのない他の応答は、サイトのHSTSをキャンセルしません。
max-age=0
の設定は、サイトのHSTSをキャンセルする正しい方法でもあります(受信ユーザーエージェントごと)。私が見つけた唯一の方法は、あなたがやっている方法で標準的ではないことですが、HTTPを介してヘッダーを送信していることも-これは準拠ユーザーエージェントによって無視されますが、無効であるため、これだけを送信するようにします接続が安全な場合(できる限り標準に準拠するのが最善です)。
ヘッダーを発行するかどうかは、次のコードで確認できます ページがHTTPS 経由でアクセスされたことを確認します。
<?php
function isSSL(){
if($_SERVER['https'] == 1) /* Apache */ {
return TRUE;
} elseif ($_SERVER['https'] == 'on') /* IIS */ {
return TRUE;
} elseif ($_SERVER['SERVER_PORT'] == 443) /* others */ {
return TRUE;
} else {
return FALSE; /* just using http */
}
}
?>
HSTSヘッダーは、ドメイン(またはincludeSubDomain
ディレクティブで提供されている場合はサブドメイン)用です。ただし、max-age
の値が0の場合、ユーザーエージェントはHSTSの使用を中止します。 ( ドラフト仕様のセクション6.1.1 を参照してください。)