Webアプリのセキュリティヘッダー:完全セットアップガイド
ファイル転送Webアプリのためのセキュリティヘッダーを設定。CSP・HSTS・X-Frame-Options等で一般的なWeb攻撃を防御。
セキュリティヘッダーはブラウザにページの振る舞いを制約する方法を指示する HTTP レスポンスフィールドです。クライアントサイドの AES-256-GCM 暗号化を行うファイル転送アプリにとって、最も重要なヘッダーは6つあります。HTTPS を強制する Strict-Transport-Security、スクリプトインジェクションをブロックする Content-Security-Policy、クリックジャッキングを防ぐ X-Frame-Options、URL フラグメントの漏洩を止める Referrer-Policy、未使用のブラウザ API を無効化する Permissions-Policy、ブラウジングコンテキストを隔離する Cross-Origin-Opener-Policy です。これらを正しく設定すれば、JavaScript を1行も変えずに実用的なクライアントサイド攻撃の80% をブロックできます。
HSTS とプリロードリスト
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload はブラウザに2年間、プレーン HTTP では接続しないよう指示します。preload ディレクティブにより Chrome の HSTS プリロードリスト(hstspreload.org)への申請資格が得られます。これはブラウザとともに配布されるため、最初のリクエストも HTTPS 経由になり、初回の中間者攻撃ウィンドウが排除されます。申請は一方通行で、削除には数ヶ月かかります。まず数日間 max-age=300 でテストしてください。HSTS プリロードなしのファイル転送サービスは、1回の DNS ハイジャックで偽のアップロードフォームを提供される恐れがあります。
実際に機能する Content Security Policy
CSP はデプロイが最も難しく、最も価値があるヘッダーです。ファイル転送アプリ向けの厳格なポリシーは次のようになります。default-src 'none'; script-src 'self' 'wasm-unsafe-eval'; connect-src 'self' https://upload.hexatransfer.com; style-src 'self'; img-src 'self' data:; font-src 'self'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'。インラインスクリプトなし、wasm を除いた eval なし、サードパーティへの接続なしです。インラインのイベントハンドラはすべて外部ファイルの addEventListener に移してください。'wasm-unsafe-eval' は libsodium.js に必要で、これなしでは Argon2id がインスタンス化されません。
すべてのバンドルへのサブリソース整合性
JavaScript が jsDelivr や unpkg などの CDN から読み込まれる場合、すべてのスクリプトタグに integrity="sha384-..." 属性を追加します。ブラウザはハッシュが一致しないスクリプトの実行を拒否するため、侵害された CDN が密かにバックドアを仕込んだバンドルをプッシュできません。自己ホストのスクリプトには SRI は重要度が低いですが、それでも防御として有効です。SRI と CSP の require-sri-for script style(非推奨ですが Chrome はまだ対応)を組み合わせるか、ビルドパイプラインで強制してください。 HexaTransfer はリリースごとのハッシュを公開しているため、用心深いユーザーが手動で検証できます。
X-Frame-Options とフレーム祖先
クリックジャッキング攻撃は、別のページの上に透明な iframe でアップロードページを読み込み、ユーザーを騙して意図しないファイルを「送信」させます。X-Frame-Options: DENY はすべてのフレーミングをブロックします。現代的な代替は Content-Security-Policy: frame-ancestors 'none' です。両方を設定してください。古いブラウザはレガシーヘッダーのみを尊重し、新しいブラウザは CSP を優先します。ファイル転送アプリで SAMEORIGIN は使わないでください。別のページからアップロード UI をフレームする正当な理由はありません。
Referrer-Policy でフラグメント漏洩を防ぐ
ブラウザはデフォルトで Referer ヘッダーから URL フラグメント(復号鍵が保存される #key=... の部分)を除去しますが、パス部分はまだ漏洩します。Referrer-Policy: no-referrer はすべてのリファラー情報をブロックします。外部へのリンクにリファラーヘッダーがなく、クロスオリジンの漏洩がなく、外部トラッカーによる URL フィンガープリンティングもありません。/d/7Kj9xQmN2vP8rBwLsE4fT#k=abc のダウンロードページでは、ユーザーがクリックスルーした外部ドメインにスラグが漏洩することを防ぎます。ヘッダーでサイト全体に設定し、リンクごとの rel="noreferrer" に頼らないでください。
多層防御のための Permissions-Policy
アプリがカメラ、マイク、位置情報、USB API を使わない場合は、明示的に拒否してください。Permissions-Policy: camera=(), microphone=(), geolocation=(), usb=(), bluetooth=(), accelerometer=(), magnetometer=(), gyroscope=(), payment=()。CSP をすり抜けた XSS でも、ウェブカメラを起動してユーザーの顔を録画できなくなります。このヘッダーはデプロイが安価で、ファイル転送ワークフローへの UX 影響はなく、厳格に開始した場合の SOC 2 監査者との「なぜ CSP が厳格でないか」という会話の記録が短くなることをセキュリティレビュアーに示します。
クロスオリジン隔離ヘッダー
高解像度タイマーと SharedArrayBuffer(一部の wasm 暗号実装に必要)へのアクセスには、Cross-Origin-Opener-Policy: same-origin と Cross-Origin-Embedder-Policy: require-corp によるクロスオリジン隔離が必要です。これらのヘッダーはまた、隣接するオリジンから AES 鍵を漏洩させる可能性がある Spectre スタイルのサイドチャネル攻撃も防ぎます。トレードオフは、埋め込まれたサードパーティリソース(YouTube 動画、Stripe チェックアウト)が Cross-Origin-Resource-Policy: cross-origin を提供しない限り壊れることです。サードパーティの埋め込みがない単目的のファイル転送アプリでは、隔離は無償で得られます。
機密ページのキャッシュ制御
ダウンロード確認ページには短命の復号鍵やセッショントークンが表示される場合があります。キャッシュを防いでください。Cache-Control: no-store, must-revalidate と Pragma: no-cache を設定します。no-cache だけでは不十分です。それはオリジンへの再検証を許可するため、キャッシュがまだ発生します。アップロードページの JavaScript バンドルには逆のことが当てはまります。コンテンツハッシュされたファイル名(/js/main-a7b3c9.js)と長い max-age を設定して、無効化の手間なく CDN キャッシュが機能するようにします。ヘッダーはパスごとに的確に適用してください。
X-Content-Type-Options と MIME スニッフィング
X-Content-Type-Options: nosniff はブラウザがコンテンツに基づいて MIME タイプを推測することを防ぎます。これがなければ、攻撃者がアップロードした <script> を含む .txt ファイルが、サービスから返されるときに HTML としてレンダリングされる可能性があります。ユーザー制御のダウンロードを提供する転送サービスでは、nosniff と Content-Disposition: attachment; filename="..." を組み合わせて、ブラウザがレンダリングではなくダウンロードするようにします。ファイル名をサーバーサイドでパストラバーサル(../../../etc/passwd)に対して検証し、表示以外の目的にアップロードのメタデータを信用しないでください。
監視と CSP レポート
まず CSP を report-only モードでデプロイし、1週間 report-uri エンドポイントで違反を収集し、正当な問題を修正してから強制してください。Content-Security-Policy-Report-Only で観察し、Content-Security-Policy に切り替えて強制します。レポートエンドポイントは各違反を JSON POST で受け取ります(ブロックされた URI、違反したディレクティブ、ソースファイル、行番号)。Report URI などのサービスや自己ホストの Sentry がこれらを収集します。週次でレビューしてください。本物の攻撃は、以前に見たことのない珍しいブロック URI として現れます。
成果の評価
本番 URL を securityheaders.com と Mozilla Observatory で診断してください。A または A+ グレードは完璧ではありませんが最低限の基準です。ほとんどのファイル転送競合他社は Permissions-Policy を忘れたり CSP で 'unsafe-inline' を許可したりして B 以下のスコアになっています。小さなサービスでも WeTransfer のセキュリティヘッダースコアを簡単に超えられます。ヘッダーの追加にコストはかかりません。最初から厳格にした場合、SOC 2 監査者との「なぜ CSP が厳格でないか」という会話の記録が短くなります。
hexatransfer.comでお試しください — 無料、登録不要、最大10GB。
エンドツーエンド暗号化で大容量ファイルを安全に送信
エンドツーエンド暗号化で最大10GBのファイルを無料で転送。アカウント不要。ファイルはアップロード前にブラウザで暗号化されるため、他の誰にも読まれません。
ファイルを送信