バニラのHTMLでサイトを管理するときに気をつけるべきセキュリティ対策

バニラのHTMLでサイトを管理するときに気をつけるべきセキュリティ対策

記事
IT・テクノロジー
バニラのHTML(いわゆる“静的サイト”)は、サーバー側の処理やデータベースを持たないぶん、攻撃面が少なく比較的安全と言われます。しかし、安全なのは「正しく運用できている場合」に限られます。実際には、CDN・外部スクリプト・フォームサービス・解析タグ・デプロイ手順など“周辺”が弱いと、静的でも十分に狙われます。
本稿では、静的サイト特有の脅威と、今日の運用で必須の対策を体系的にまとめます。

まずは脅威モデルを理解する

サプライチェーンのリスク
外部CDNのライブラリ、広告・解析タグ、SNS埋め込みなど、第三者のコードがページで実行されます。改ざん・乗っ取り・なりすましが起きると、ユーザーのブラウザで被害が発生します。

配信経路・ホスティングのリスク
HTTPS・証明書・DNS・CDN設定・SFTP/SSH鍵の管理が甘いと、盗聴・改ざん・乗っ取りに繋がります。

コンテンツ差し替え・改ざん
Gitやストレージ、ビルド成果物、サーバー上のファイルに不正アクセスされると、静的ファイルでも容易に置き換えられます。

埋め込み・リンク由来のリスク
target=_blank のタブナビング、危険なiframe埋め込み、無制限のCORSなど、フロントエンド設定の不備から攻撃されます。

プライバシー・法令順守
不要なデータ収集、クッキー同意無しのトラッキング、誤ったログ保持などは法令・規約に抵触しやすく、ビジネス上の重大リスクです。

技術設定まわりの必須対策(静的サイトでも“今は必須”)

常時HTTPS化と強制リダイレクト
すべてのページをHTTPSで配信し、HTTPへ来たアクセスはHTTPSへ自動リダイレクトする運用にします。証明書の自動更新(Auto-Renew)も忘れずに。

強力なHTTPレスポンスヘッダー
コード不要でも、サーバーやCDNの設定でセキュアにできます。代表例は以下です。

Content Security Policy(CSP):読み込むドメインをホワイトリスト化し、インラインスクリプト・外部スクリプトを厳格に制御します。まずは Report-Only で誤ブロックを検証し、段階的に厳しくします。

HSTS:ブラウザにHTTPSのみを使わせ、ダウングレード攻撃を防ぎます。

X-Content-Type-Options / MIME Sniffing防止:意図しない実行を防ぎます。

Referrer-Policy:参照元URLの漏えいを最小化します。

Permissions-Policy:カメラ・マイク・位置情報・フルスクリーン等のAPIをデフォルトで無効化します。

Frame系対策(CSPのframe-ancestors等):クリックジャッキングを避けます。

外部スクリプトの最小化・固定化
解析タグやUIライブラリは“必要最小限”にし、提供元を厳選します。バージョン固定・ハッシュ検証(SRI)・サブリソースの定期棚卸しを行い、不要になったタグは削除します。可能なら自前ホスティングで依存先を減らします。

CORSの原則“閉鎖”
静的APIレスポンスやアセットに対して * 相当の許可を行わず、必要なオリジンだけを許可する方針にします。

iframe埋め込みの安全化
埋め込みは原則最小限。提供元を厳選し、不要な権限(フルスクリーン、決済、カメラ等)は許可しない方針を徹底します。

リンクのタブナビング対策
新しいタブで外部リンクを開く設計のときは、タブ乗っ取り対策を有効にします(設計ポリシーとして明文化しておきます)。

ディレクトリリスティング無効化・余計なエラー情報の非表示
ファイル一覧が見える設定は情報漏えいです。404/500等のエラーページにも、サーバー名や詳細スタックを出さない方針にします。

運用まわりの必須対策(“人と手順”の堅牢化)

デプロイ経路の秘匿化と権限分離
FTPは使わず、SFTP/SSH鍵や専用のデプロイキーを利用します。公開鍵は必要最小限の権限に限定し、不要になった鍵は即時削除。作業者ごとに資格情報を分け、共有しません。

ホスティング・CDN・DNSのアカウント保護
2段階認証(MFA)を必須化、長いランダムなパスワード、定期的な権限レビュー。レジストラロックやDNSSECの適用も検討します。

WAF/レート制限/Bot対策の活用
CDNのWAFを有効化し、怪しい国・ASNのトラフィック、スキャン行為、特定パスへの過剰アクセスをレート制限。必要に応じて国別ブロックも検討します。

変更管理(Change Management)
Gitで履歴を管理し、PRレビュー・CI経由でのみ公開する運用に統一します。直接サーバー上で編集しないのが鉄則です。タグやリリースノートで変更の可視化も行います。

バックアップとロールバック手順
アセット・HTML・設定を定期バックアップし、復元手順を文章化しておきます。バックアップの暗号化・外部保管・復元テストの実施が肝心です。

監視と検知
稼働監視(ステータス監視、証明書期限、DNS変更検知)、改ざん検知(ハッシュ照合・差分監視)、アナリティクス異常検知(急増・急減)を仕組み化します。連絡先を示す「security.txt」の設置も有益です。

外部サービス・フォームを使うときの注意

フォームサービスの選定
HTTPS対応、スパム対策、レート制限、保存データの保護方針を確認します。受信メールに個人情報を載せない設定、通知の暗号化、保管期間の最小化を徹底します。

ファイルアップロードの扱い
静的サイトでのファイル受け取りは基本避け、必要な場合は信頼できるストレージとウイルススキャンを用意します。ユーザーがアップしたファイルをそのまま配信しない方針を取ります。

埋め込みウィジェットの権限評価
チャットボット、決済、広告、SNSなどは、最小権限・最小スコープで導入します。不要になったものは即撤去します。

プライバシーと法令順守

データ最小化の原則
解析タグ・広告タグは必要最小限。IPの匿名化、計測のオプトアウト、クッキー同意の適切な実装方針を決めます。

ポリシー整備
プライバシーポリシーとクッキーポリシーを整備し、問い合わせ窓口を明示します。第三者提供や再委託の有無、保存期間、利用目的を具体的に記載します。

ログ管理
収集するログ(アクセスログ、WAFログ等)の保存期間・アクセス権限・暗号化を定義します。個人情報が写らないよう配慮します。

クリエイティブ素材と情報漏えいの最小化

画像・PDFのメタデータ
撮影場所や端末情報などのEXIFを必要に応じて除去します。PDFのプロパティ・埋め込み情報にも注意します。

ステージングURLの露出防止
テスト環境やドラフトURLを外部からクロールされないようにし、公開前のリンク共有は限定的に行います。

よくある落とし穴

「静的だから安全」と思い、CSPもHSTSも未設定。

外部JSを多数読み込み、誰も棚卸しせず数年放置。

FTPや共有パスワードを使い回し、退職者アカウントの無効化を失念。

解析タグや広告の設定だけ残して非稼働、しかし権限は生きておりリスクに。

証明書の期限切れやDNS乗っ取りに気づく仕組みがない。

404/500ページにサーバー詳細やバージョンを出してしまう。

スターターチェックリスト(運用に組み込むと安全度が上がります)

 常時HTTPS(自動更新)とHSTSを有効化

 CSPをReport-Onlyで検証→本番適用、Permissions-PolicyやReferrer-Policyも設定

 外部スクリプトを最小化・棚卸し、不要タグの撤去、可能なら自前配信

 CORSは原則閉鎖、iframeは最小限・最小権限

 デプロイはGit + CI/CD、サーバー直接編集は廃止

 アカウントはMFA必須、鍵・権限の定期レビュー

 CDNのWAF・レート制限を有効化

 バックアップとロールバック手順を整備し、復元テストを実施

 稼働監視・改ざん検知・証明書期限・DNS変更の監視を常設

 プライバシーポリシー整備、データ最小化と同意管理

 画像・PDFのメタデータ点検、ステージングURL露出防止

まとめ

静的サイトのセキュリティは「サーバーサイド機能が少ない=安全」ではなく、配信・依存・運用の三つ巴です。
外部依存を最小化し、配信経路を堅牢化し、運用の“人と手順”をセキュアに保てば、バニラHTMLでも十分に強いサイトになります。逆に、ここを怠ると静的でも簡単に突破されます。今日の静的運用は、“軽量”であると同時に“堅牢”であることが求められます。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す