• PHP
「HTTPセキュリティヘッダー」とは?個人情報扱うサイト、企業サイトは必須の設定!

セキュリティヘッダーとは

悪意のあるスクリプトがあなたのサイトで動くのを防いだり、危険な通信の接続方法を禁止したりすることによって、ユーザーとサイトを守ります

HTTPセキュリティヘッダー主な目的

HTTPセキュリティヘッダーの役割と保護 ブラウザ Webサーバー HTTPリクエスト HTTPレスポンス + セキュリティヘッダー セキュリティヘッダーによる保護 Content-Security-Policy リソース読み込み元の制限 X-Frame-Options クリックジャッキング防止 Strict-Transport-Security HTTPS接続の強制 Referrer-Policy リファラー情報の漏洩防止 X-Content-Type-Options MIME スニッフィング防止 Permissions-Policy ブラウザ機能の使用制限 攻撃者 XSS攻撃 中間者攻撃 クリックジャッキング 実装: Webサーバー設定 (.htaccess, httpd.conf), アプリケーションコード, CDN設定

主要なセキュリティヘッダー

  1. Content-Security-Policy (CSP)
    • ウェブページが読み込める外部リソース(スクリプト、スタイル、画像など)の出所を制限します
    • XSS攻撃を効果的に防止する最も強力なセキュリティヘッダーの一つです

CSPを厳しく設定しすぎると、GTMが正常に機能しなくなり、ウェブサイトのアナリティクスやマーケティングツールが動作しなくなる可能性があります。そのため、CSP設定時には必要なドメインと機能を適切に許可する必要があります。

Content Security Policy (CSP) と Google Tag Manager (GTM) あなたのウェブサイト CSP セキュリティポリシー Google Tag Manager googletagmanager.com インラインスクリプト (unsafe-inline) Google Analytics その他トラッキング カスタムスクリプト (unsafe-eval) 許可/ブロック CSPが正しく設定されていないと GTMやトラッキングツールが 機能しなくなる可能性があります
  1. X-Frame-Options
    • ウェブページが他のサイトのフレーム内で表示されることを制限します
    • クリックジャッキング攻撃(ユーザーが意図しないボタンやリンクをクリックするよう誘導する攻撃)を防止します
  2. X-Content-Type-Options
    • ブラウザによるMIMEタイプの推測(スニッフィング)を防止します
    • ファイルタイプの偽装による攻撃を防ぎます
  3. Strict-Transport-Security (HSTS)
    • ウェブサイトへの接続をHTTPSのみに強制します
    • 中間者攻撃やプロトコルダウングレード攻撃を防止します
  4. X-XSS-Protection
    • ブラウザ内蔵のクロスサイトスクリプティング対策を有効化します
    • 最新のブラウザではCSPに置き換えられつつありますが、下位互換性のために使用されることがあります
  5. Referrer-Policy
    • ブラウザが他のウェブサイトにリクエストを送る際に、どの程度のリファラー情報を送信するかを制御します
    • 機密情報の漏洩を防止します
  6. Permissions-Policy (旧Feature-Policy)
    • ブラウザの特定の機能(カメラ、マイク、位置情報など)の使用を制限します
    • ウェブサイトが持つべき権限を明示的に定義します

セキュリティヘッダーの実装方法

セキュリティヘッダーは様々な方法で実装できます:

  1. ウェブサーバーの設定
    • Apache (.htaccessファイルやhttpd.confなど)
    • Nginx (nginx.confなど)
    • IIS (web.configなど)
  2. アプリケーションコード内
    • PHP、Node.js、Rubyなどのバックエンドコードで設定

セキュリティヘッダーの基本的なPHPでの設定方法

<?php
// セキュリティヘッダーを設定
header("X-Frame-Options: SAMEORIGIN");
header("X-XSS-Protection: 1; mode=block");
header("X-Content-Type-Options: nosniff");
header("Referrer-Policy: strict-origin-when-cross-origin");
header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline';");
header("Strict-Transport-Security: max-age=31536000; includeSubDomains");
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Pragma: no-cache");

// 以下、通常のPHPコード
?>
  1. CDN/WAF設定
    • Cloudflareなどのサービスを通じて設定

フレームワークを使っている場合

Laravel、Symfony、WordPressなどのフレームワークやCMSを使用している場合は、それぞれ専用の設定方法があります。例えばLaravelでは、ミドルウェアを使って設定することが一般的です。

この設定は必ずHTML出力の前に行う必要があります。それ以外の点では、通常のPHPファイルと同じように扱うことができます。