クロスサイトスクリプティング ( XSS )
書籍を読んで
こちらの書籍を読んでWebアプリケーションを作る際に重要な要点を自分用としてアウトプットします。
クロスサイト・スクリプティング(XSS)
通常、Webアプリケーションには外部からの入力などに応じて表示が変化する箇所があり、この部分のHTMLの生成の実装に問題があると、XSSという脆弱性が生じる
正しいHTMLを生成する事がXSS解消への第一歩
必須対策
表示の際に、HTMLで特殊な意味を持つ記号文字(メタ文字)をエスケープすること
共通対策
HTTPレスポンスに文字エンコーディンを明示する
PHPでの開発の場合
HTMLのエスケープ処理に htmlspecialchars関数を利用出来る
$string, $quote_style, $charset
実際のプログラミング
- 要素内容については $quote_styleはどの値でもよい
- 属性値は以下の両方を行う
- 属性値はダブルクォートで囲う
- $quote_styleは、ENT_COMPATかENT_QUOTESを指定する
シングルクォートで囲う事や、ENT_QUOTESで統一するのも安全側に倒した良い方法を取る形で良い
攻撃手法
- クッキー値の盗み出し
- その他のJavaScriptによる攻撃
- 画面の書き換え
保険対策
- X-XSS-Protection レスポンスヘッダの使用
- 入力値の検証
- 条件に合致しない入力の場合にエラーを表示させ、再入力を促す
- 自由書式の入力欄についてはこの方法では対策できない
- CookieにHttpOnly属性を付与
-
- HttpOnly属性 -> JavaScriptからのクッキーの読み出しを禁止する
- セッションIDの盗み出しを防止することが出来る
-
- TRACEメソッドの無効化
- 古いブラウザに対して有効なXSTという攻撃がある
- 現在はほぼないと考えられる
- ただ、TRACEメソッドを許可していると脆弱性と考えられてしまう
JavaScriptの文字列リテラルの動的生成の対策
JavaScriptのエスケープルールは複雑なため、脆弱性の温床になりやすい
出来ればJavaScriptを動的生成することは避けたい
しかし、動的パラメータを渡したいというニーズは多い為、2種類の方法を紹介
- カスタムデータ属性の利用
- script要素の外部でパラメータを定義して、JavaScriptから参照する方法
- インラインJSONPによる方法
- JSON形式のパラメータを伴う関数をscript要素で呼び出す
HTMLタグやCSSの入力を許す場合の対策
利用者の入力にHTMLタグやCSSの入力を許可したい場合
--> ライブラリを利用するのが望ましい
PHP -> HTML Purifier(http://htmlpurifier.org/)
エラーメッセージからの情報漏洩
- エラーメッセージに攻撃者にとって有益なアプリケーションの内部情報が含まれる
- 意図的な攻撃として、エラーメッセージに秘密情報(個人情報など)を表示させられる
このような問題があるため、エラーが発生した場合、利用者に表示する画面はエラー内容ではなく、「アクセスが集中しています ~」にとどめ、エラーの詳細内容はエラーログに出力するようにする。
さらに進んだ学習のために