プロクラ(クラウドAIロボット、詳しい役)SabaKore

セキュリティ

XSS:投稿された内容が他の人のブラウザで動く

2026年8月17日

レン(新米インフラエンジニア)

レン

コメント機能を作ったよ。投稿された文章をそのまま表示してるだけ。
ウィルスン(セキュリティの番人)・ドヤ顔

ウィルスン

「そのまま」か。良い響きだ。ではワタシは、文章ではなくプログラムを投稿しよう。それがそのまま表示されれば、他の閲覧者のブラウザでワタシのプログラムが動くことになる。
レン(新米インフラエンジニア)・がーん

レン

他の人のブラウザで!?ぼくのサーバーじゃなくて?
プロクラ(クラウドAIロボット、詳しい役)・教える

プロクラ

そこがこの攻撃の厄介なところだよ。被害を受けるのはサーバーではなく、そのページを見に来た利用者なんだ。攻撃者はキミのサイトを、他人を攻撃するための踏み台にする。

守りは「重ねる」のが基本

攻撃

ファイアウォール

不要な入口を塞ぐ

SSH鍵認証

総当たりを無効化

OS更新

既知の穴を埋める

サーバー

1つ破られても次の層で止まる。どれか1つでは不十分

何をされるのか

  • ログイン中の利用者のセッション情報を盗み、なりすます
  • 偽のログインフォームを表示させ、パスワードを入力させる
  • 利用者が意図しない操作を、本人の権限で実行させる
  • 別のサイトへ勝手に転送する
プロクラ(クラウドAIロボット、詳しい役)・困った

プロクラ

特に怖いのは3つめだよ。管理者がそのページを開いた瞬間に、管理者の権限で操作が実行される。攻撃者は自分でログインする必要すらないんだ。

入り込む経路は投稿欄だけではない

プロクラ(クラウドAIロボット、詳しい役)・分析中

プロクラ

「利用者から受け取った値を画面に出す」場所は、思っているより多いんだ。投稿欄だけを見ていると漏れるよ。
  • コメントや投稿の本文
  • URLに付いた値(検索キーワードをそのまま画面に出す等)
  • エラー画面に表示される入力内容
  • アップロードされたファイルの名前
  • 外部から取り込んだデータ(自分が書いていないもの全般)

防ぎ方:表示するときに無害化する

プロクラ(クラウドAIロボット、詳しい役)・分析中

プロクラ

考え方はSQLインジェクションと似ているよ。「データ」と「命令」を混ぜないこと。投稿された文字を画面に出すときに、HTMLとして特別な意味を持つ記号を、ただの文字として表示されるよう変換する。これをエスケープと言うんだ。
プロクラ(クラウドAIロボット、詳しい役)

プロクラ

重要なのは、保存するときではなく「表示するとき」に処理することだよ。同じデータでも、表示する場所によって必要な処理が違うからね。
レン(新米インフラエンジニア)・調べ中

レン

保存するときに変換しちゃダメなの?そのほうが1回で済むのに。
プロクラ(クラウドAIロボット、詳しい役)・教える

プロクラ

同じデータを、本文として出すこともあれば、属性の中や、URLの一部として出すこともある。必要な変換はそれぞれ違うんだ。保存時に決め打ちすると、別の場所で足りなくなるか、二重に変換されて文字化けする。だから出口で処理する。
レン(新米インフラエンジニア)・調べ中

レン

自分で全部やらないとダメ?
プロクラ(クラウドAIロボット、詳しい役)・嬉しい

プロクラ

いや、最近のフレームワークは標準でエスケープしてくれるものが多いよ。危険なのは、それを自分で無効にしたときなんだ。「HTMLをそのまま出力する」機能を使うときは、本当に必要か立ち止まって考えよう。

投稿でHTMLを許可したい場合

プロクラ(クラウドAIロボット、詳しい役)・困った

プロクラ

装飾を許したい場合もあるよね。その場合は、自作の除去処理ではなく、実績のある専用ライブラリで「許可するタグだけを通す」方式にしよう。この手の処理は抜け道が多く、自作はまず失敗するからね。
ウィルスン(セキュリティの番人)・ニヤリ

ウィルスン

…危険な文字を消す、という方式か。ワタシはその「消す処理」をすり抜ける書き方を探すだけでよい。過去に見つかった抜け道は数え切れんぞ。
プロクラ(クラウドAIロボット、詳しい役)・OK

プロクラ

だから「危険なものを消す」ではなく「安全だと決めたものだけ通す」に発想を変えるんだ。この違いは、セキュリティ全般で効いてくる考え方だよ。

盗まれるものを減らしておく

プロクラ(クラウドAIロボット、詳しい役)・分析中

プロクラ

万一やられたときの被害を小さくする備えもある。合わせて入れておこう。
  • セッションのCookieにHttpOnly属性を付ける(プログラムから読めなくなる)
  • 重要な操作には、パスワードの再入力など別の確認を挟む
  • 実行できるプログラムの出所を制限する仕組み(CSP)を使う
  • 管理画面を、一般の利用者が投稿した内容と同じ場所に置かない
レン(新米インフラエンジニア)・できた

レン

出口で無害化する。消すんじゃなくて通すものを決める。属性でも守っておく。

あわせて読みたい

→ コラム記事をすべて見る