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

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

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

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

プロクラ
特に怖いのは3つめだよ。管理者がそのページを開いた瞬間に、管理者の権限で操作が実行される。攻撃者は自分でログインする必要すらないんだ。
入り込む経路は投稿欄だけではない
見落としやすいのは、URLのパラメータ、エラー画面に表示する入力値、そして外部から取り込んだデータです。人が打ち込む欄だけを警戒していると、これらが素通りします。表示する直前に無害化する、という置き方にすれば、どの経路から来ても同じ処理が掛かります。

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

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

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

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

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

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

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

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

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

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

レン
出口で無害化する。消すんじゃなくて通すものを決める。属性でも守っておく。
VPSの料金を比較する
あわせて読みたい
- セキュリティログを別の場所へ送るべきかサーバーの中にしかないログは、消される可能性があります。外へ送る意味と、個人運用でどこまでやるかの判断、簡易な代替手段を解説します。
- セキュリティ自分は書いていないコードの脆弱性自分が書いていないコードの脆弱性をどう把握するか、警告が出たときに何を基準に判断するか、こまめに更新を続けるための工夫までを解説します。
- セキュリティ信頼していたライブラリが乗っ取られる信頼していたライブラリが乗っ取られる手口と、完全には防げない前提での備え。更新を取り込む時期を自分で決める方法と、入られた後を小さくする設定を解説します。
- セキュリティ狙われる入口を減らす:攻撃面という考え方忘れられたサービスがなぜ危険なのか、今動いているものを知るコマンド、減らせる典型例、そして入口を増やさないための記録の残し方を解説します。