技術の犬小屋

Webプログラミングを餌に生きる犬のメモ帳

XSS脆弱性への対策方法について勉強した。サニタイズ言うなキャンペーンにも目を通した。Webアプリケーションのセキュリティに詳しい,高木浩光先生や徳丸浩先生の考え方を含めながら,まとめてみる。
 

XSSとは

ソフトウェアのセキュリティホールの一つで,Webサイトの訪問者の入力をそのまま画面に表示する掲示板などのプログラムが,悪意のあるコードを訪問者のブラウザに送ってしまう脆弱性のこと。
悪意を持ったユーザがフォームなどを通してJavaScriptなどのスクリプトコードを入力した時に,プログラム側に適切なチェック機構がないと,そのスクリプト内容がそのままHTMLに埋め込まれ,ページを閲覧したコンピュータでスクリプトが実行されてしまうことがある。
 

サニタイズとは

Webサイトの入力フォームへの入力データから,HTMLタグ,JavaScript,SQL文などを検出し,それらを他の文字列に置き換える操作のこと。「無害化」とも呼ばれ,サニタイジング操作により,入力データ中に含まれる悪意のあるHTMLタグ,JavaScript,SQL文などが解釈・実行されることを防ぐ。
 

サニタイズはするべきではない

ここまで見て,まず考えるのが「XSS対策としてサニタイズすれば良いのではないか」ということであるが,サニタイズはXSS対策の保険的なものであり,本来,サニタイズは推奨されない。
 
日本における「サニタイズ」という言葉の持つ意味やニュアンスを厳密に定義すると「入力処理で受け取ったデータに含まれる有害(別のリテラルで解釈可能)なメタ文字に対して,エスケープ処理を行うこと」となる。
ここで注意したいのは,「サニタイズ」は「バリデーション」とは全く異なるという点である。バリデーションを行うことは一般的なので,ここでは深く説明はしないが,「バリデーション」という言葉の定義は「入力処理で受け取ったデータに対して,データの妥当性をチェックすること」であり,サニタイズとは異なる。
 
では,何故サニタイズをしてはいけないのか,ということについての理由を説明する。まず,大前提として「サニタイズ」は間違った習慣が根付いてしまったものであり,本来は推奨されるべきではない,ということを念頭に置いてほしい。
 
サニタイズが推奨されないことには,以下の2つの理由がある。

  • プログラマの都合で,ユーザーが入力した内容を勝手に改変するべきではない
  • サニタイズが行われると,システムが汚染される

以下,それぞれの理由について説明する。
 

プログラマの都合で,ユーザーが入力した内容を勝手に改変するべきではない

いくらセキュリティ上の危険があるからといって,ユーザーが入力した内容を勝手に改変してよい理由はない。もし,メタ文字のエスケープが必要になる入力が行われたとしたら,それは本来はエラーにするべきである。
 

サニタイズが行われると,システムが汚染される

サニタイズは「スクリプトで受け取ったデータに含まれる,<>&"といったメタ文字を,JavaScriptのリテラルとして解釈できてしまう」という問題への付け焼刃的な対策方法である。だが,必ずしもXSSへの対策にサニタイズを行う必要はなく,出力処理で適切にエスケープ処理を行うことで,XSS脆弱性を回避することが可能である。
ここで大切なのは「サニタイズ」という言葉の定義を正しく理解することである。「サニタイズ」とは「入力処理で有害なメタ文字をエスケープ処理すること」である。「出力処理で有害なメタ文字をエスケープすること」を「サニタイズ」とは呼ばない。
 
ここで,どうして「入力処理」ではなく,「出力処理」でメタ文字をエスケープすることにこだわるのか,ということについて説明する。その理由は,メタ文字のエスケープ処理がシステムにもたらす「汚染」とも呼ぶべき影響範囲をなるべく小さくするためである。
 
ここでの「汚染」とは,入力データがエスケープ処理によって,本来のデータとは異なるデータに書き換えられることによって発生する,システムへの害のことを指す。
もし,入力処理でメタ文字のエスケープ処理を行った場合,エスケープ処理の影響は,システム内部やDBにまで波及する。つまり,システム内部やDBにて,エスケープ処理されたデータを,本来のデータに戻すための2次3次的な変更が発生することになる。
一方,出力処理でメタ文字のエスケープ処理を行った場合,エスケープ処理の影響はシステム内のどこにも波及することはない。
 
以上の理由から,XSS対策に,サニタイズ(入力処理でのメタ文字のエスケープ処理)は推奨されない。XSS対策には,出力処理でのメタ文字のエスケープ処理を行うべきである。
 

まとめ

  • サニタイズとは,「入力処理でメタ文字をエスケープすること」である
  • XSS脆弱性対策には,サニタイズは行わず,出力処理で適切にエスケープ処理を行う

 
 
以上
 
 
参考
クロスサイトスクリプティングとは 【 XSS 】 【 Cross Site Scripting 】 – 意味/解説/説明/定義 : IT用語辞典
サニタイジングとは 【 sanitizing 】 〔 サニタイズ 〕 – 意味/解説/説明/定義 : IT用語辞典
高木浩光@自宅の日記 – WASF Times版「サニタイズ言うな!」
XSS再入門
XSS: 今こそXSS対策についてまとめよう – 徳丸浩の日記(2008-08-22)

横組文書における句読点の扱いについて arrow-right
Next post

arrow-left SQLインジェクション脆弱性への対策について
Previous post

コメントを残す