セキュリティ
XSS:投稿された内容が他の人のブラウザで動く
2026年8月17日
レン
コメント機能を作ったよ。投稿された文章をそのまま表示してるだけ。

ウィルスン
「そのまま」か。良い響きだ。ではワタシは、文章ではなくプログラムを投稿しよう。それがそのまま表示されれば、他の閲覧者のブラウザでワタシのプログラムが動くことになる。

レン
他の人のブラウザで!?ぼくのサーバーじゃなくて?

プロクラ
そこがこの攻撃の厄介なところだよ。被害を受けるのはサーバーではなく、そのページを見に来た利用者なんだ。攻撃者はキミのサイトを、他人を攻撃するための踏み台にする。
守りは「重ねる」のが基本
攻撃
ファイアウォール
不要な入口を塞ぐ
SSH鍵認証
総当たりを無効化
OS更新
既知の穴を埋める
サーバー
1つ破られても次の層で止まる。どれか1つでは不十分
何をされるのか
- ログイン中の利用者のセッション情報を盗み、なりすます
- 偽のログインフォームを表示させ、パスワードを入力させる
- 利用者が意図しない操作を、本人の権限で実行させる
- 別のサイトへ勝手に転送する

プロクラ
特に怖いのは3つめだよ。管理者がそのページを開いた瞬間に、管理者の権限で操作が実行される。攻撃者は自分でログインする必要すらないんだ。
入り込む経路は投稿欄だけではない

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

プロクラ
考え方はSQLインジェクションと似ているよ。「データ」と「命令」を混ぜないこと。投稿された文字を画面に出すときに、HTMLとして特別な意味を持つ記号を、ただの文字として表示されるよう変換する。これをエスケープと言うんだ。
プロクラ
重要なのは、保存するときではなく「表示するとき」に処理することだよ。同じデータでも、表示する場所によって必要な処理が違うからね。

レン
保存するときに変換しちゃダメなの?そのほうが1回で済むのに。

プロクラ
同じデータを、本文として出すこともあれば、属性の中や、URLの一部として出すこともある。必要な変換はそれぞれ違うんだ。保存時に決め打ちすると、別の場所で足りなくなるか、二重に変換されて文字化けする。だから出口で処理する。

レン
自分で全部やらないとダメ?

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

プロクラ
装飾を許したい場合もあるよね。その場合は、自作の除去処理ではなく、実績のある専用ライブラリで「許可するタグだけを通す」方式にしよう。この手の処理は抜け道が多く、自作はまず失敗するからね。

ウィルスン
…危険な文字を消す、という方式か。ワタシはその「消す処理」をすり抜ける書き方を探すだけでよい。過去に見つかった抜け道は数え切れんぞ。

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

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

レン
出口で無害化する。消すんじゃなくて通すものを決める。属性でも守っておく。
あわせて読みたい
- セキュリティ使わなくなったVPSを放置するとどうなるか止めたつもりでも課金は続き、更新されないサーバーは他人に使われます。放置で起きることと、閉じるときにやるべきことを順に解説します。
- セキュリティ事業者から「攻撃の踏み台になっている」と連絡が来たら自分のサーバーが加害側になったときの初動。優先すべき順番と、通信を止めることが最優先である理由、そして復旧までの進め方を解説します。
- セキュリティ総当たり攻撃のログが止まらない:無視していいのか毎日大量に届く認証失敗の記録を、どこまで気にすべきか。放置してよい条件と、本当に危ない記録の見分け方、ログを減らす手段を解説します。
- セキュリティDockerのポート公開がファイアウォールを迂回するufwで閉じたはずのポートに外から繋がってしまう理由と、確認の方法。公開範囲を限定する書き方と、データベースを外に出さない構成を解説します。