JavaScript Tips | セキュリティ:innerHTML利用時の安全対策

JavaScript JavaScript
スポンサーリンク
スポンサーリンク
  1. innerHTML利用時の安全対策は「便利さと危険性のバランスを取るための設計」です
  2. innerHTMLが危険になる典型的なパターンをまず理解する
    1. 危険な例1:ユーザー入力をそのままinnerHTMLに入れる
    2. 危険な例2:URLパラメータをそのままinnerHTMLに入れる
  3. ステップ1:「innerHTMLは“生HTMLを注入するための危険な道具”」という認識を持つ
  4. ステップ2:テキストを表示したいだけなら、まずはinnerHTMLを使わない
    1. 危険な書き方
    2. 安全な書き方
  5. ステップ3:「静的テンプレート+動的データ」のときの安全なinnerHTML利用パターン
    1. 危険な書き方(全部を文字列連結で作る)
    2. 安全な書き方(HTML構造はDOMで作り、テキストはtextContentで入れる)
  6. ステップ4:どうしてもinnerHTMLに動的なHTMLを入れたい場合は「サニタイズ」を挟む
    1. 使用例
  7. ステップ5:業務で使える「innerHTML安全利用ユーティリティ」を作る
    1. 使用例
  8. ステップ6:innerHTMLと他の危険APIの「セット」を意識する
    1. 例:危険な書き方
    2. 安全な方針
  9. ステップ7:フレームワーク利用時も「innerHTML相当の機能」に注意する
    1. Reactの dangerouslySetInnerHTML
    2. Vueの v-html
  10. ステップ8:innerHTMLとXSSの関係を深く理解しておく
  11. ステップ9:チームで共有するための「innerHTML利用ルール」をコードとドキュメントに刻む
    1. コードコメントで明示する
    2. レビュー時のチェックポイント
  12. まとめ:innerHTML利用時の安全対策は「便利な道具に“安全カバー”を付けるための設計」です

innerHTML利用時の安全対策は「便利さと危険性のバランスを取るための設計」です

業務システムのフロントエンドでは、innerHTML はとても魅力的なAPIです。 一行で複雑なHTMLを差し込めて、テンプレート的な使い方もしやすいからです。

element.innerHTML = "<p>こんにちは</p>";
JavaScript

しかし同時に、innerHTMLDOM Injection や XSS攻撃の入り口になりやすい危険なAPI でもあります。 特に「外部から来た文字列」をそのまま innerHTML に渡すと、一気にリスクが高まります。

ここでは、初心者向けに、

  • なぜ innerHTML が危険になりうるのか
  • どんなときに使ってよいのか/ダメなのか
  • 安全に使うためのユーティリティと設計

をステップバイステップで解説していきます。

innerHTMLが危険になる典型的なパターンをまず理解する

危険な例1:ユーザー入力をそのままinnerHTMLに入れる

const comment = getUserInputComment(); // ユーザー入力
document.getElementById("comment").innerHTML = comment; // 危険
JavaScript

攻撃者が次のような文字列を入力するとします。

<script>alert('XSS');</script>

すると、ブラウザはこれを「文字列」ではなく 実際の <script> タグとして解釈し、JavaScriptを実行してしまいます。

危険な例2:URLパラメータをそのままinnerHTMLに入れる

const params = new URLSearchParams(location.search);
const msg = params.get("msg");
document.getElementById("message").innerHTML = msg; // 危険
JavaScript

攻撃者は次のようなURLを作れます。

https://example.com/page?msg=<img src=x onerror=alert('XSS')>

これを開くと、 <img src=x onerror=...> がそのままDOMに注入され、 onerror に書かれたJavaScriptが実行されます。

ポイント:innerHTML は「文字列をHTMLとして解釈する」APIであり、 外部入力をそのまま渡すと、攻撃者に「HTMLを書く権限」を渡してしまうことになります。

タイトルとURLをコピーしました