「画面の中の泥棒」を防ごう!XSS(クロスサイトスクリプティング)入門と防御の鉄則
こんにちは。セキュリティの現場で日々、見えない敵と戦っているエンジニアです。
今日は、Web開発の世界で昔からあるのに、今でも猛威を振るっている「XSS(クロスサイトスクリプティング)」についてお話しします。名前は難しそうですが、仕組みを知れば怖くありません。
家の防犯に例えながら、泥棒がどんな手口で侵入してくるのか、そしてどうやってそれを防ぐのか、一緒に見ていきましょう!
—
そもそも、XSSって何者なの?
XSSを一言で言うと、「あなたのWebサイトを乗っ取って、ユーザーの情報を盗んだり、悪意のあるページへ誘導したりする攻撃」のことです。
これを家に例えてみましょう。
あなたは、郵便受け(入力フォーム)を作りました。中身を確認する人は、届いた手紙をそのまま読んで「中身」を信じますよね? もし、そこに泥棒が「この手紙を読んだ人は、隣の家の鍵を開けろ」という偽の命令を忍ばせていたらどうでしょう?
Webサイトで言うと、ユーザーが入力したコメントや検索ワードが、Webサイトのプログラムによって「正しい命令」としてブラウザに実行されてしまうのがXSSの正体です。
XSSには「3つのタイプ」があるよ
1. 反射型(Reflected XSS): 泥棒が「このURLをクリックして!」と罠を仕掛けます。クリックすると、URLに埋め込まれた悪意あるスクリプトがWebサイトに一度「反射」してブラウザで実行されます。
2. 格納型(Stored XSS): 泥棒が掲示板などに悪意あるスクリプトを書き込みます。サイトのデータベースに保存されるため、そのページを見る人全員が被害に遭う、一番タチの悪いタイプです。
3. DOM型(DOM-based XSS): サーバーを通さず、ブラウザの中で完結する攻撃です。JavaScriptの処理が甘い隙を突いて実行されます。
—
WAFで「泥棒の動き」を検知しよう
Webアプリケーションファイアウォール(WAF)は、いわば「家の入り口に立っている敏腕警備員」です。泥棒が投げてくる怪しい手紙(ペイロード)を、入り口で食い止めます。
WAFでチェックすべき「怪しい手紙」のパターン
WAFの設定では、以下のような文字列が混ざっていないかを監視します。
:泥棒が一番使いたがる「命令書」のタグです。onerror=,onload=:画像などが読み込めなかった時に動くプログラムを悪用します。javascript::リンクをクリックした瞬間に命令を実行させます。
WAF設定の例(簡易的なイメージ):
怪しいキーワードが含まれていたら即座に遮断するルール BLOCK if URI matches " のようなURLは、明らかに何かの命令を送り込もうとしています。
ログ分析のコツ:
「HTTPステータスコード 403(拒否)」が急増していないかチェックしてください。WAFが頑張ってブロックしてくれている証拠ですが、攻撃が激化しているサインでもあります。
---
開発者が守るべき「3つの防犯対策」
警備員(WAF)に頼り切るのではなく、そもそも「手紙の中身を信じない」仕組みを作ることが、真の防犯です。
1. 「出力」する時に必ずエスケープする
ユーザーが入力した文字を画面に表示する時、< や > を「普通の文字」として扱うように変換(エスケープ)します。
<→<>→>
これだけで、ブラウザは「これは命令ではなく、ただの文章だな」と判断してくれます。
2. コンテンツセキュリティポリシー(CSP)を使う
ブラウザに対して「このサイトでは外部からの怪しいスクリプトは絶対に実行しないで!」とルールを教えるヘッダーです。HTMLの 内に以下のように設定します。
3. 入力値のチェックは厳しく
「名前」を入力する欄なら数字や記号は禁止する、など、入力できる文字を限定しましょう。泥棒が侵入できる隙間を極限まで減らすのがコツです。
---
最後に:セキュリティは「継続」がすべて
「一度設定したら終わり」ではありません。泥棒も常に新しい手口を研究しています。
大切なのは、「自分の書いたコードが、悪意あるユーザーにどう悪用される可能性があるか?」を想像する習慣を持つことです。
一歩ずつ、焦らずに対策を学んでいきましょう。あなたの書くコードが、安全で信頼されるWebサイトの礎になります。応援しています!
コメント