🔖
【セキュリティ】CSRF,XSSについてとその対策
「安全なウェブサイトの作り方」より
CSRF(クロスサイト・リクエスト・フォージェリ)
ログインした利用者からのリクエストについて、その利用者が意図したリクエストであるかどうかを識別する仕組みを持たないウェブサイトは、外部サイトを経由した悪意のあるリクエストを受け入れてしまう場合がある。
発生しうる脅威
- ログイン後の利用者のみが利用可能なサービスの悪用
- 不正な送金。利用者が意図しない商品の購入、利用者がいとしない退会処理等
- ログイン後の利用者のみが編集可能な情報の改竄、新規登録
- 各種設定の不正な変更、掲示板への不適切な書き込み等
注意が必要なウェブサイトの特徴
- Cookieを用いたセッション管理
- Basic認証
- SSLクライアント認証
- 金銭処理が発生するサイト
- その他、ログイン機能を持つサイト
解決策
処理を実行するページをPOSTメソッドでアクセスするようにして、そのhiddenパラメータに秘密の情報が挿入されるよう、前のページを自動生成して、実行ページではその値が正しい場合のみ処理を実行する
処理を実行する直前のページで再度パスワードの入力を求め、実行ページでは、再度入力されたパスワードが正しい場合のみ処理を実行する
Refererが正しいリンク元かを確認し、正しい場合のみ処理を実行する
クロスサイトスクリプティング
ウェブアプリケーションの中には利用者の入力情報やhttpヘッダの情報を処理し、webページとして出力するものがある。Webページへの出力処理に問題がある場合、そのウェブページにスクリプトを埋め込まれてしまう。この問題をクロスサイトスクリプティングとよぶ。
発生しうつ脅威
- 本物サイト上に偽のページが表示される
- ブラウザが保存してるxCookieを取得される
- 任意のCookieをブラウザに保存させられる
注意が必要なウェブサイトの特徴
- 入力内容を確認させっる表示画面(会員登録、アンケート等)
- ご入力時の再入力を要求する画面で、前の入力内容を表示するとき
- 検索結果の表示
- エラーの表示
- コメントの反映(ブログ、掲示板等)等
対策について
対策のための3分類
- HTMLテキストの入力を許可しない場合の対策
- Webページに出力する全ての要素に対してエスケープ処理を施す
- ユーザーからの入力がそのままコードとして実行されることを防ぐ
- javascript:で始まるものもあるけどこれはダメ
- http://やhttps://から始まる文字列のみを許可するホワイトリスト方式で実装する
- <script>...</script>要素の内容を動的に生成しない
- スタイルシートを任意のサイトから取り込めるようにしない
- 入力値の内容チェックを行う
- Webページに出力する全ての要素に対してエスケープ処理を施す
- HTMLテキストの入力を許可する場合の対策
- 入力されたHTMLテキストから構文解析木を作成し、スクリプトを含まない必要な要素のみを抽出する
- 入力されたHTMLテキストからスクリプトに該当する文字列を排除する
- 全てのウェブアプリケーションに共通の対策
- HTTPレスポンスヘッダのContent-Typeフィールドに文字コード(charset)を指定する
- Cookie情報の漏洩対策として、発行するCookieにHttpOnly属性を加え、TRACEメソッドを無効化する
- この属性が設定されたCookieはHTMLテキストないのスクリプトからのアクセスが禁止される
- クロスサイトスクリプティングの潜在的な脆弱性対策として有効なブラウザ機能を有効にするレスポンスヘッダを返す
- ブラウザにはXSS対策の機能を備えたものがある
- X-XSS-Protection
- Content Security Policy
Discussion