社内掲示板は投稿本文を保存し、閲覧時にHTMLの本文領域へ文字列連結して表示している。投稿者が入力した文字列がHTMLタグとして解釈され、他の利用者のブラウザで意図しないスクリプトが動いた。本文は装飾なしの文字として表示できればよい。原因に直接対応する修正はどれか。URL属性やJavaScriptの中へ投稿本文を埋め込む処理はない。
本サイトで独自に作成。IPAの試験問題からの転載ではありません。
公開日:
選択肢を選んで、答え合わせをしましょう。
回答せずに正解・解説を確認する
正解:イ 投稿本文をHTMLとして解釈させず、HTMLの本文領域に適したエスケープ又は安全なテキスト挿入APIで表示する
この表示だけでは、回答数や正答率は変わりません。
解説
保存された入力が閲覧時に実行可能なHTMLとして解釈されるのが、この事例の問題です。本文を文字として扱い、HTML本文の文脈に合うエスケープやテキスト挿入を使えば、入力中のタグを表示用の文字にできます。保存時のSQL対策とは別の境界を守る必要があります。
SQLのパラメータ化はSQLインジェクション対策です。ブラウザでHTMLとして解釈される問題は残ります。
装飾不要という要件のもとで、入力を実行可能なHTMLにしない表示方法が直接の対策です。
認証済みであっても、投稿内容を実行可能なコードとして信頼してよいことにはなりません。
符号化を戻してからHTMLとして挿入すれば、元と同じ解釈が起きます。
関連知識
これは保存型XSSの事例です。必要な処理は出力先の文脈によって異なります。HTML本文、属性、URL、JavaScriptでは同じエスケープを使い回せません。装飾を許可する場合には、許可する要素や属性を限定する別の設計が必要です。
間違えやすいポイント
入力時に一度処理すれば、どこへ表示しても安全、と考えないこと。どの文脈へ出力するかを確認します。CSPなど追加の防御だけで安全な出力処理を省略しません。
覚え方
入力はデータ。表示先の文脈に合わせて扱う。
実務での意味
コメント、検索結果、プロフィール名など利用者が作る文字列について、表示コンポーネントが安全なテキスト挿入を使うかをコードレビューします。
解説:本サイト編集部によるオリジナル文章