
ようこそ。今回はHTMLインジェクションに深掘りします。小さく見えても放置すると厄介な脆弱性で、開発者・運用者の双方が理解して対策すべき内容です。初心者にも分かるように基礎から実践的な予防策までまとめています。
免責事項:
本記事はサイバーセキュリティ教育および開発者向け防御啓発を目的として作成されています。
記載された攻撃例やコードは、実験用・検証用の安全な環境でのみ再現してください。
実際のシステムへの不正アクセスや改ざん行為は法律で禁止されています。
TL;DR
- HTMLインジェクションは攻撃者が悪意あるHTMLコードをページに注入できる脆弱性で、見た目や挙動を改変される可能性があります。
- 不適切な入力サニタイズが原因で、改ざん・フィッシング・ひどい場合はXSSに発展します。
- 対策は入力の検証・サニタイズ、セキュアなコーディング、CSP(Content Security Policy)の導入などです。以下で詳述します。
HTMLインジェクションとは?
例えばブログのコメント欄でユーザーが <b>太字!</b> のようなタグを投稿したとします。サイトがその入力を正しく扱わずにそのまま出力してしまうと、コメント欄に太字が表示されます。これが HTMLインジェクションの基本イメージ — 攻撃者が HTML を「忍び込ませる」ことでサイトの外観や機能を変更できてしまいます。
XSS(クロスサイトスクリプティング)とは異なり、必ずしも JavaScript を伴うわけではありませんが、 <script> タグを許してしまうと容易に XSS に転じます。言い換えれば、HTMLインジェクションはより大きな問題(XSS 等)への入り口になりえます。
なぜ発生するのか?
HTMLインジェクションは次のような場合に発生します:
- フォームやURLパラメータなどのユーザー入力が適切にサニタイズされていない
- サーバーがユーザー入力をそのまま HTML としてレンダリングしている
- 開発者がユーザー入力を過信している(これはしないでください)
例:脆弱なコメント表示(JSON PATCH の例)
PATCH /activity/comment/3 HTTP/2
Host: directus.local
{
"comment": "<h1>TEST <p style=\"color:red\">HTML INJECTION</p> <a href=\"//evil.com\">Test Link</a></h1>"
}

(参考:Directus 脆弱性アドバイザリ)
技術的な深掘り:内部で何が起きるか
ブラウザは受け取った HTML をパースしてレンダリングします。ユーザー入力が適切にエスケープされずにページに組み込まれると、ブラウザはそれを正規のマークアップとして扱います。
仕組み(概略)
- 攻撃者がフォームやURL等から悪意ある HTML を送信
- サーバーがそのまま保存または反映(サニタイズ無し)
- ブラウザがページを受け取り、注入された HTML をレンダリング(構造や挙動が変わる)
脆弱な PHP スクリプトの例:
<?php
$comment = $_POST['comment'];
echo "<div>$comment</div>";
?>
ここに攻撃者が <img src="invalid" onerror="alert('Hacked!')"> を入れると、onerror の JavaScript が実行され XSS になります。よって HTMLインジェクションは XSS に進展する可能性があるため特に危険です。
HTMLインジェクションの種類
- Stored(保存型):データベース等に保存され、全ユーザーに表示される(例:コメント欄)。
- Reflected(反射型):リクエストに応じて応答に反映され、そのリクエストを行ったユーザーのみ影響を受ける(例:操作を伴うリンク)。
- DOM-based:クライアントサイドで DOM を直接操作する過程で発生する(やや発生頻度は低いが危険)。
リスクと影響
- UI改ざん:見た目の改変や信頼低下。
- フィッシング:偽フォームで機密情報を詐取。
- XSSへの発展:クッキーやセッションが盗まれるリスク。
- 情報漏洩:iframeやリダイレクトで外部へ誘導・送信される可能性。
HTMLインジェクション防止のための推奨事項
安全性は「複数の対策を重ねる」ことが重要です。実践的な対策を列挙します。
1. 入力のサニタイズ
- JavaScript なら DOMPurify、Python なら bleach 等のライブラリで許可された HTML 以外を除去する。
- 出力時に特殊文字をエスケープする(
<→<など)。
2. 入力のバリデーション
- 受け付ける値を厳格に定義(ユーザー名は英数字のみ等)。
- HTML を本当に必要としない場合はタグ全てを拒否する。
3. 安全なフレームワークを使う
- React や Angular 等はデフォルトでエスケープを行うため危険を減らせる。
innerHTMLのような直接 DOM 更新は避けるか必ずサニタイズしたデータのみ使う。
4. Content Security Policy(CSP)の導入
- スクリプトの実行元を制限することで XSS の被害を軽減できる。
- ただし CSP は万能ではないため他対策と併用する。
5. チーム教育
- 開発者へ安全なコーディング教育を行い、ユーザー入力の不信を徹底する。
参考(Reference)
更に学ぶための公式/信頼できる資料:
- OWASP: HTML Injection
- MDN: Content Security Policy
- DOMPurify(GitHub)
- OWASP Secure Coding Practices Quick Reference Guide
まとめ(Wrapping Up)
HTMLインジェクションは一見軽微でも、放置すればブランド信頼を損ない、フィッシングやXSSといった重大な被害に発展する可能性があります。
開発・運用の現場では、入力サニタイズやCSPといった多層防御を継続的に実践することが重要です。
今後もCyberCrewでは、脆弱性の正しい理解と防御技術の普及を目指して解説を続けていきます。
注意・免責:
- 本記事の内容は、Webセキュリティ教育および防御研究を目的とした技術的解説です。実在システムへの適用は法令に抵触する可能性があります。
- 記事内のコード例・リクエスト例は安全な検証環境でのみ実施してください。
- CyberCrewは、本記事を用いた不正行為や損害について一切の責任を負いません。
投稿者プロフィール

- ハリス ディルシャン
-
Offensive Security Engineer | Red Team Specialist
レッドチーム演習やペネトレーションテスト、脅威モデリングを専門とするオフェンシブセキュリティエンジニアです。エンタープライズ環境やWeb・モバイルアプリ、API、クラウドサービスにおけるセキュリティ評価を多数実施し、CTFやマルウェア解析、アンチウイルス回避などにも精通しています。2020年にはCEH Master世界ランキングでトップ10入りを果たし、国際的に高い評価を得ています。
主な保有資格:
● OSCP(Offensive Security Certified Professional)
● CPENT(Certified Penetration Testing Professional)
● eCPPT(Certified Professional Penetration Tester)
● eMAPT(Mobile Application Penetration Tester)
● CRTS(Certified Red Team Specialist)
● CEH Master(認定エシカルハッカー)
● SOC-100(Security Operations Essentials)
● PEN-100(Network Penetration Testing Essentials)
● SLIIT – 情報技術学士(サイバーセキュリティ専攻)
最新の投稿
HTB2025.12.03【セキュリティ解説】HTMLインジェクション:あなたのウェブアプリに潜む静かな脅威
HTB2025.11.26【DLLプロキシローディング解説】第1回:DLL Proxy Loading の仕組みと原理
HTB2025.11.19【Hack The Box入門】Broker 攻略解説
HTB2025.11.12【Hack The Box入門】Knife 攻略ガイド(Retired Machine)