SC Workbook
科目 A-2 · セキュリティ

DOM Based XSS のコード

Web ページに次の JavaScript が含まれている。攻撃者が利用者に https://www.example.com/top#%3Cimg%20src%3Dx%20onerror%3Dalert(1)%3E という URL を開かせる攻撃に関する記述として,適切なものはどれか。

const msg = decodeURIComponent(location.hash.slice(1));
document.getElementById("notice").innerHTML = msg;
  1. アWeb サーバで応答の HTML を生成する際に,リクエストのパラメータを HTML エスケープして出力するようにすれば,この攻撃は防げる。
  2. イセッション ID を格納する Cookie に HttpOnly 属性を付与すれば,挿入された img 要素の onerror 属性に書かれたスクリプトは実行されなくなる。
  3. ウ攻撃文字列はブラウザ上の JavaScript によって DOM に書き込まれるので,innerHTML ではなく textContent を用いて,文字列をテキストとして挿入するように修正する。
  4. エdecodeURIComponent は %3C などを < のような文字参照に変換するので,innerHTML に代入しても img 要素は生成されない。
正解と解説を見る

正解 ウ

この問題の基礎知識

  • DOM Based XSS は,ブラウザ上の JavaScript が外部から与えられた値を DOM に書き込む処理で発生する XSS であり,サーバ側の処理を経由せずに起こり得る。
  • URL のフラグメント(# 以降)はサーバに送信されず,ブラウザ上のスクリプトから location.hash で参照される。decodeURIComponent はパーセントエンコーディングを元の文字に戻す処理である。
  • innerHTML に代入した文字列は HTML として解釈されるが,textContent に代入した文字列はテキストとして扱われ,タグやスクリプトとして解釈されない。
  • Cookie の HttpOnly 属性は JavaScript からの Cookie の読取りを禁止するだけであり,挿入されたスクリプトの実行そのものは防がない。
アWeb サーバで応答の HTML を生成する際に,リクエストのパラメータを HTML エスケープして出力するようにすれば,この攻撃は防げる。

URL のフラグメント(# 以降)は,リソースを取得する前に URI から切り離され,サーバには送信されない。スクリプトの挿入はブラウザ上の JavaScript の処理だけで起こるので,サーバ側のエスケープでは防げない。

イセッション ID を格納する Cookie に HttpOnly 属性を付与すれば,挿入された img 要素の onerror 属性に書かれたスクリプトは実行されなくなる。

HttpOnly 属性は,JavaScript から Cookie を読み取れなくするものであり,スクリプトの実行そのものは止めない。挿入されたスクリプトは実行され,Cookie の窃取以外の不正な操作は可能である。

ウ攻撃文字列はブラウザ上の JavaScript によって DOM に書き込まれるので,innerHTML ではなく textContent を用いて,文字列をテキストとして挿入するように修正する。正解

location.hash の値を innerHTML に代入すると,文字列が HTML として解釈され,img 要素の onerror 属性のスクリプトが実行される(DOM Based XSS)。textContent は値をテキストとして扱うので,コードは実行されない。

エdecodeURIComponent は %3C などを < のような文字参照に変換するので,innerHTML に代入しても img 要素は生成されない。

decodeURIComponent は,パーセントエンコーディングされた文字を元の文字に戻す処理であり,%3C は「<」に戻る。HTML のエスケープとは逆に,タグとして解釈される文字列を作り出す。

検証用の出典出典照合済み
OWASP DOM based XSS Prevention Cheat Sheet / RFC 3986 Uniform Resource Identifier (URI): Generic Syntax / OWASP Session Management Cheat Sheet
照合の根拠(6 件)

URL の # 以降はサーバに送られず,location.hash を decodeURIComponent で戻した「<img src=x onerror=alert(1)>」が innerHTML で HTML として解釈されるので,ブラウザ内だけで完結する DOM Based XSS になる。html.spec.whatwg.org は 403 のため OWASP で代替。

問題 ID A2-SEC-0101 · AI 作成のオリジナル問題 · 正解と各選択肢の根拠を出典の原文で確認しています。 照合日 2026-11-08

非公式の学習用アプリです(IPA とは関係ありません)。問題はすべて AI が作成したオリジナルで、誤りを含む場合があります。