昔掲示板にスクリプトを埋め込むタイプのXSSがあったそうですが

federica-galli-aiqKc07b5PA-unsplash.jpg

質問

昔掲示板にスクリプトを埋め込むタイプのXSSがあったそうですが、これは何型のXSS?
どうやれば防げる?


日経ITエンジニアスクール コマンド&スクリプト最強の指南書 【電子書籍】

価格:2640円
(2026/8/28 20:33時点)
感想(0件)

ITエンジニア1年生のための まんがでわかるLinux コマンド&シェルスクリプト基礎編 【電子書籍】[ Piro ]

価格:2420円
(2026/8/28 20:33時点)
感想(0件)


解答

はい。昔の掲示板でよく問題になった「投稿欄にスクリプトを仕込んで、閲覧者のブラウザで実行させる」タイプなら、典型的には Stored XSS(蓄積型XSS) です。

どういう仕組み?

例えば掲示板が、

投稿者  ↓「コメント」を投稿  ↓サーバー  ↓DBに保存  ↓別のユーザーが掲示板を見る  ↓保存された内容がHTMLとして出力される  ↓ブラウザでスクリプトが実行

という仕組みだったとします。

問題は、投稿内容を単なる「文字列」として扱わず、HTMLとして解釈できる状態でページに埋め込んでしまうことです。

これがStored XSSです。


どうやって防ぐ?

一番基本は、

ユーザーから受け取った文字列を、HTMLとして実行されない形で出力する

ことです。

例えばユーザーがHTMLとして意味を持つ文字列を投稿したとしても、

<something>

をそのままHTMLに入れるのではなく、ブラウザ上では単なる文字として表示されるようにします。

これがHTMLエスケープです。

例えば概念的には、

<  →  &lt;>  →  &gt;&  →  &amp;"  →  &quot;'  →  &#39;

などに変換します。

するとブラウザは、

<something>

を「HTMLタグ」ではなく、

<something>

というただの文字列として表示します。


「入力時に削除」ではなく「出力時にエスケープ」が基本

ここは重要です。

ありがちな発想が、

投稿 ↓危険そうな文字を削除 ↓DB保存

ですが、これはあまり良い防御方法ではありません。

なぜなら、

「危険な文字列とは何か」を完全に列挙するのが難しい

からです。

そのため基本は、

ユーザー入力 ↓そのまま保存 ↓出力するときに「HTMLとして解釈されない形」にする ↓ブラウザ

です。

もちろん、HTMLを許可する必要があるサービスなら、単純なエスケープではなく許可するタグ・属性だけを残すサニタイズが必要になります。


最近のWebフレームワークはかなり防いでくれる

例えばテンプレートエンジンには、

「これはユーザー入力だからHTMLとして解釈させない」

という自動エスケープ機能があります。

イメージとして、

テンプレート「こんにちは {{ username }} さん」

にユーザー入力を渡すと、

username = ユーザー入力

を自動的にHTMLエスケープしてくれます。

そのため現代のフレームワークでは、普通にテンプレートを使っているだけならXSSになりにくい設計になっています。

ただし、

HTMLをそのまま挿入する機能

などを使うと、自動エスケープを意図的に無効化することができるため、そこが危険になります。


さらにCSPも使う

以前話していたCSPもXSS対策として非常に重要です。

例えば、

Content-Security-Policy:  default-src 'self';  script-src 'self'

のようにして、

「このページでは、許可した場所のスクリプトしか実行しない」

という制約をブラウザに与えます。

CSPはXSSそのものを修正するものではありません

エスケープ    ↓XSSを発生させないCSP    ↓万一XSSが発生しても被害を抑える

という関係です。


Cookieも防御になる

XSSによるセッション乗っ取り対策としては、Cookieに

HttpOnlySecureSameSite

などの属性を設定します。

特に HttpOnly が付いたCookieは、JavaScriptから直接読み取れません。

ただし、

HttpOnlyを設定すればXSSが安全になる

わけではありません。

XSSが成立していると、被害者のブラウザ上でサイトの権限を使って操作される可能性があるためです。


掲示板の場合はこうするのが基本

              投稿               ↓          サーバーで受信               ↓             DB保存               ↓        ┌──────┴──────┐        │             │   通常の文字列    HTMLを許可したい        │             │   HTMLエスケープ    サニタイズ        │             │        └──────┬──────┘               ↓              HTML               ↓             Browser               ↓             表示

そして追加で、

CSPCookie属性入力値のバリデーションフレームワークの自動エスケープ

などを組み合わせます。

まとめると

昔の掲示板の「投稿内容にスクリプトを仕込んで、他の人がその投稿を見ると実行される」タイプなら、ほぼ典型的なStored XSSです。

防御の中心は**「ユーザー入力をHTMLとして解釈させない」=コンテキストに応じた出力エンコーディング(HTMLエスケープ)**です。

そして、CSPや HttpOnly Cookieは「もし突破されたらどうするか」という多層防御として考えると整理しやすいです。





 



この記事へのコメント