セキュリティヘッダー評価

サーバーの応答に含まれる6つの短い行が、ページをどれだけ慎重に扱うべきかをブラウザに伝えます。このチェックはそれを読み取って100点満点で採点し、足りない行を書き出します。

例: github.com, wikipedia.org

ヘッダーは中身ではなく指示

ブラウザがページを要求するたびに、サーバーは2つの部分で応答します。2つ目はページそのものです。1つ目はヘッダーの一覧で、訪問者の目には触れない名前と値の短い行です。ファイルの種類、キャッシュする期間、保持するCookieなどが書かれています。

そのうちのいくつかがセキュリティの指示です。サーバーへの侵入を難しくするものではありません。最近のブラウザにすでに組み込まれていながら、サイトが求めるまでオフになっている保護機能をオンにするものです。どれも送らないサイトでも問題なく動きます。ただ、無料の防具を箱に入れたままにしているだけです。

このチェックが採点する6つのヘッダー

ヘッダー点数防ぐもの
Strict-Transport-Security25悪意のあるWi-Fiで、訪問者が暗号化されていないhttp://にこっそり格下げされること。初回訪問以降、ブラウザはmax-ageで指定された期間、そのドメインへの暗号化なしのHTTP接続を拒否します。
Content-Security-Policy25注入されたスクリプト。コードを読み込んでよい場所の一覧を公開し、それ以外はすべてブロックします。攻撃者がコメント欄やフォームの項目に<script>タグを紛れ込ませても同じです。
X-Frame-Options15クリックジャッキング。別のサイトがあなたのサイトを見えないフレームに読み込み、人をだましてあなたのボタンを押させる手口です。現在の同等の仕組みはCSP内のframe-ancestorsで、このチェックはそちらも認めます。
X-Content-Type-Options15ファイル種類の推測。nosniffがあれば、画像としてアップロードされたファイルが、ブラウザに「スクリプトに見えた」という理由で実行されることはありません。
Referrer-Policy10URLに含まれる個人的な情報も含め、ページの完全なアドレスがリンク先のすべてのサイトに漏れること。
Permissions-Policy10埋め込まれた第三者のコンテンツが、あなたの名前でカメラ、マイク、位置情報を求めること。

配点は、それぞれが防ぐ被害の大きさに従っています。25点の2つは、実際に口座を空にするような攻撃を止めます。10点のものはプライバシーとマナーの問題です。

評価の読み方

ヘッダーが満点になるのは、その値がきちんと役目を果たしている場合だけです。部分点になるのは次の3つの場合です:

  • 6か月より短いHSTS。1日のmax-ageはテスト中なら問題ありませんが、再訪問者を守れるのも1日だけです。
  • nonceやハッシュなしで'unsafe-inline'や'unsafe-eval'を許可しているCSP。それはまさに、ポリシーが閉じるはずだった扉です。
  • Report-OnlyモードのCSP。監視と報告はしますが、まだ何もブロックしません。最初の一歩としては正しいやり方です。そこで止まらなければの話ですが。

このチェックは、ページが設定する各Cookieと、それにSecure、HttpOnly、SameSiteが付いているかも一覧にします。これらのフラグは点数に含まれませんが、フラグのないセッションCookieは、ヘッダーで得た効果の多くを台無しにします。

ここでのAは、この1つの応答でブラウザ側の保護機能がオンになっているという意味です。パスワード、プラグイン、サーバーのパッチについては何もわかりません。同じサイトでもページによって送るヘッダーが違うことがあるので、重要なページ(ログイン、決済、アカウント)をテストしてください。

どこに追加するか

ヘッダーは応答が作られる場所で設定し、訪問者に最も近い層の設定が優先されます:

CDNやプロキシ(Cloudflare、Fastly、ホスティング会社のエッジ)
たいていはダッシュボードの「レスポンスヘッダー」や「変換」ルールです。1つのルールで、キャッシュされたページも含めサイト全体をカバーできます。
Apache
.htaccessまたはバーチャルホストに:Header always set X-Content-Type-Options "nosniff"。alwaysを付けると、エラーページにも適用されます。
nginx
serverブロックにadd_header X-Content-Type-Options "nosniff" always;。1つ注意点があります。locationブロック内のadd_headerは、上位の設定に追加されるのではなく、置き換えてしまいます。
アプリケーション
フレームワークやCMSのプラグインもヘッダーを送れますが、自分が生成するページだけです。ウェブサーバーが直接配信する静的ファイルには付きません。

まずは何も壊す心配のない4つから始めましょう。nosniff、X-Frame-Options: SAMEORIGIN、Referrer-Policy、Permissions-Policyです。HSTSは、すべてのサブドメインがHTTPSで動くようになってから追加します。Content-Security-Policyは最後にし、まずreport-onlyモードで導入してください。間違ったCSPは自分のスクリプトまでブロックしてしまうからです。

よくある質問

セキュリティヘッダーを追加するとサイトが壊れますか?

6つのうち4つは、よく調べずに追加しても安全です。注意が必要なのはHSTSとContent-Security-Policyの2つです。HSTSは設定した期間、訪問者をHTTPSに固定するため、includeSubDomainsを使うなら、すべてのサブドメインに有効な証明書がすでに必要です。CSPは一覧にないものをすべてブロックします。適用する前に、Content-Security-Policy-Report-Onlyで1〜2週間テストしてください。

セキュリティヘッダーはSEOに効果がありますか?

直接の効果はありません。検索エンジンはヘッダーでページの順位を決めません。HTTPSは弱いランキング要因で、HSTSはHTTPSを確実に維持させます。本当の利点は、乗っ取られるページが減ることです。乗っ取られたサイトはすぐに順位を落とします。

X-XSS-Protectionが一覧にないのはなぜですか?

このヘッダーが制御していたフィルターは、ブラウザから削除されました。Chromeは2019年に廃止し、Firefoxには最初からありませんでした。現在は、このヘッダーを省くか0に設定し、代わりにContent-Security-Policyに頼るのが推奨されています。

HSTSのmax-ageはどのくらいにすべきですか?

1年(max-age=31536000)が一般的な目標で、ブラウザのプリロードリストの最低条件でもあります。まず数分から始めて、何も壊れないことを確認してから段階的に延ばしてください。このチェックでは6か月以上で満点になります。

サイトはCloudflareの裏にあります。これは誰のヘッダーですか?

訪問者が受け取るヘッダーで、重要なのはそちらです。オリジンサーバーがヘッダーを設定していても、CDNがそれを削除したり上書きしたりすれば、評価はCDN側の内容を反映します。