web-dev-qa-db-ja.com

PHPでHSTSヘッダーを発行することに問題はありますか?

最初はサイト全体で有効にすることなく、ブログで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を実装できます。

8
Scott Helme

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 */
    }

}
?>
11
SilverlightFox

HSTSヘッダーは、ドメイン(またはincludeSubDomainディレクティブで提供されている場合はサブドメイン)用です。ただし、max-ageの値が0の場合、ユーザーエージェントはHSTSの使用を中止します。 ( ドラフト仕様のセクション6.1.1 を参照してください。)

0
Novice User