セキュリティレスポンスヘッダーを設定することで、クライアントが侵入されるのを効果的に防ぐことができます。
URL の検出#
イントロダクションと設定#
HTTP 厳格輸送セキュリティ(HSTS)#
http は平文で送信され、完全に暗号化されていないため、誰でも送信データからブラウザとサーバー間のすべての内容を取得できます。したがって、https で使用される TLS 暗号化は非常に評価されます。しかし、特別に指定しない限り、https を使用することはなく、ドメイン名にアクセスするたびに、最初にサーバーに http リクエストを送信し、次にサーバーがブラウザにリダイレクトを送信し、ブラウザが https にアップグレードします。
HSTS はこの問題を解決する方法です。
ブラウザが https サイトから送信されたStrict-Transport-Security
ヘッダーを受信すると、ブラウザは指定された時間に https アクセスを実行します。ブラウザが再度そのサイトにアクセスし、指定された時間が経過していない場合、ブラウザは HTTP リクエストを送信せず、直接 https 接続を使用します。これにより、SSL 剥離などの攻撃から未だに https 接続にアップグレードされていないものを防ぎます。
e.g.
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
このヘッダーには 3 つのパラメータがあります:max-age=63072000
、includeSubDomains
、preload
。
max-age=
は HTTPS 接続を維持する時間を示し、後に秒数が続きます。例えば、max-age=31536000
は 1 年間 https 接続のみを使用することを意味します。includeSubDomains
は、そのドメインのすべてのサブドメインが https アクセスを使用することを示します。
HSTS は良いですが、最初の接続は常に http です。もし長い間狙っているスクリプトキディ浸透専門家が常に動きを見ている場合、どうすればよいでしょう?
preload
パラメータはこの問題を解決するために使用されます。ブラウザはChromeまたはFirefoxのプリロードリストから、直接 https 接続を使用すべきサイトを取得します。このリストはHSTSpreloadで積極的に提出できます。
このリストはchrome://net-internals/#hstsでローカル Chrome 上で確認および編集できます。
X-Frame-Options#
CSP パラメータの使用を推奨
Content-Security-Policy
レスポンスヘッダーには、frame-ancestors
パラメータがあり、X-Frame-Options
レスポンスヘッダーを完全に置き換え、さらに多くの機能を持っています。
X-Frame-Options HTTP レスポンスヘッダーは、ブラウザに対してページが
<frame>
、<iframe>
、<embed>
、または<object>
内で表示されるかどうかを指示するために使用されます。サイトは、他のサイトに埋め込まれないようにすることで、クリックジャッキング攻撃を回避できます。
e.g.
X-Frame-Options: SAMEORIGIN
このヘッダーには 2 つのパラメータ、SAMEORIGIN
とDENY
があります。
SAMEORIGIN
は、そのページが同じオリジンのドメインのみがフレームを表示することを許可します。DENY
は、すべてのフレームを完全に許可しません。
X-Content-Type-Options#
このヘッダーの主な目的は、クライアントに対してレスポンスヘッダーContent-Type
で指定されたファイルのMIMEタイプを厳守するよう要求することです。そうでなければ、ブラウザはMIME-sniffing
を使用して返されたファイルの内容を推測し、実行します。
このヘッダーが設定されていない場合、画像や他のメディアファイルに隠れているjavascript
やcss
が攻撃者によってシステムに侵入される可能性があります。
e.g.
X-Content-Type-Options: nosniff
このヘッダーにはnosniff
という 1 つのパラメータがあり、クライアントに通知します。
nosniff
は、MIME タイプに一致しないリクエストを防ぎます。
X-XSS-Protection#
ブラウザの互換性
現在、Safari ブラウザのみがサポートしています。
このヘッダーは完全に構成可能な CSP ヘッダーに置き換えることができます。
このヘッダーの役割はその名前の通りで、ブラウザが XSS 攻撃を防ぐためのものであり、どの規格や草案にも属していません。
e.g.
X-XSS-Protection: 1; mode=block
このヘッダーには 4 つのパラメータがあります引用元:Mdn
-
0
XSS フィルタリングを無効にします。 -
1
XSS フィルタリングを有効にします。クロスサイトスクリプト攻撃が検出されると、ブラウザはページをクリアします(安全でない部分を削除します)。 -
1;mode=block
XSS フィルタリングを有効にします。攻撃が検出されると、ブラウザはページをクリアせず、ページの読み込みを防ぎます。 -
1; report=<reporting-URI>
は Chrome 4-77 バージョンのみがサポートします。このパラメータは XSS フィルタリングを有効にします。クロスサイトスクリプト攻撃が検出されると、ブラウザはページをクリアし、CSP report-uri の機能を使用して違反報告を送信します。
Permissions Policy#
このヘッダーは、ページがアクセスできるブラウザ機能を制御するために使用され、サイトが自らの権限範囲を事前に定義することができます。
e.g.
Permissions-Policy: geolocation=()
このヘッダーには多くのパラメータがあり、パラメータの構文は<directive>=<allowlist>
です。前半部分は権限を示し、後半部分は許可されるホワイトリストを示します。
権限リスト
document.domain
の設定を許可するかどうか
暗号化メディア拡張 API (EME) の使用を許可するかどうか
未表示のときにタスクをフレーム内で実行するかどうか
可視ビューポート外でタスクをフレーム内で実行するかどうか
Element.requestFullscreen()
の使用を許可するかどうか
Gamepad API
の使用を許可するかどうか
Geolocation API
の使用を許可するかどうか
デバイスの方向に関する情報を収集することを許可するかどうか
珍しいまたは特異なヒューマンインターフェースデバイスに接続するためにWebHID API
を使用することを許可するかどうか
ユーザーがデバイスと対話しているときに空いているかどうかを検出する API の使用を許可するかどうか
ユーザーのローカルにインストールされたフォントに関するデータを収集することを許可するかどうか
デバイスの方向に関する情報を収集することを許可するかどうか
音声入力デバイスの使用を許可するかどうか
Web MIDI API の使用を許可するかどうか
Payment Request API
の使用を許可するかどうか
対応する API を使用してピクチャーインピクチャー形式でビデオを再生することを許可するかどうか
保存された公開鍵資格情報を取得するためにWeb Authentication API
を使用することを許可するかどうか
デバイスが画面をオフにしたり暗くしたりしないように指示するためにスクリーンウェイクロック API を使用することを許可するかどうか
Web Serial API
を使用してシリアルデバイスと通信することを許可するかどうか
音声出力デバイス API を使用してスピーカーをリストし、選択することを許可するかどうか
Web USB API
の使用を許可するかどうか
Navigator.share()
を使用して、テキスト、リンク、画像、その他のコンテンツをユーザーが選択した任意の宛先に共有することを許可するかどうか
WebXR デバイス API を使用して WebXR セッションと対話することを許可するかどうか
デバイスの加速度情報を収集することを許可するかどうか
デバイスの周囲環境の明るさ情報を収集することを許可するかどうか
HTMLMediaElement
で要求されたメディアの自動再生を許可するかどうか
バッテリー状態 API の使用を許可するかどうか
ビデオ入力デバイスの使用を許可するかどうか
getDisplayMedia()
メソッドを使用して画面内容をキャプチャすることを許可するかどうか
ホワイトリストには 3 つの値があります:
*
: 現在のページおよびページ内に表示されているすべてのコンテンツがその機能を使用することを許可します。()
: その機能の使用を許可しません。(self "https://example.org")
: このパラメータはワイルドカードを使用することを許可し、各許可されたサイトをスペースで区切ります。self
はこのページを示します。
コンテンツセキュリティポリシー(CSP)#
このヘッダーは、どのコンテンツがこのページで使用され、実行されることを許可されているかを定義します。
CSP の設定は非常に複雑で、詳細については阮一峰先生のブログContent Security Policy 入門教程を参照してください。
私は輪を再発明したくありません決して書くのが面倒だからではありません
CSP ヘッダーを適切に設定した後、Google が提供するCSP Evaluatorを使用して、自分の CSP ポリシーが強力かどうかを確認できます。
スコア#
最初の 2 つの検出 URL は、レスポンスヘッダーを検出するために使用できます。Securityheaders の検出は Mozilla のものほど厳格ではなく、一般的に A + に達することができれば、セキュリティレスポンスヘッダーの設定がほぼ完了していることを示します。