引き続き、体系的に学ぶ 安全なWebアプリケーションの作り方を読んだので、覚えたい部分を記事にしていく。
クロスサイトスクリプティングとは
XSS(クロスサイトスクリプティング)とは、外部からの入力などに対して、表示が変化する部分があり、そこのHTML生成の実装に問題があることで生じる脆弱性のこと。
XSS脆弱性があることで以下のような問題が発生する。
- 利用者のブラウザ上でスクリプトが実行されてしまう
- 偽の入力フォームが表示されて、個人情報が盗まれる
対策
- 要素内容については
<
と&
をエスケープする - 属性値は、
"
で囲い、<
と"
と&
をエスケープする - HTTPレスポンスに文字エンコーディングを明示する
SQLインジェクションとは
SQLの呼び出し方に不備がある場合に発生する脆弱性のこと。
- DBの情報が盗まれる
- DBの情報が変更される
-などの影響がある。
対策
SQLインジェクション脆弱性の根本的な原因は、パラメータとして指定した文字列の一部がリテラルをはみ出すことにある。
なので、それを防ぐ必要がある。
- プレースホルダによりSQL文を組み立てる
- アプリケーション側でSQL文を組み立てるときに、リテラルを正しく構成するなどして、SQL文が変更されないようにする
クロスサイト・リクエストフォージェリ(CSRF)
重要な処理の受付の際には、利用者の意図したリクエストであることを確認する必要がある。
が、その確認が抜けているとCSRF脆弱性になる。
その結果、利用者のブラウザから勝手に重要な処理が実行されるといったことが発生する。
XSSとCSRFの違い
- 罠サイトの閲覧
- 仕掛けのあるHTMLが利用者のブラウザで実行される
- 正規サイトに攻撃用のリクエストをする
ここまではどちらも、同じ流れ。
XSSの場合
XSSの場合は、3のリクエストに含まれるスクリプトが、そのまま利用者のブラウザにレスポンスとして返却される。
利用者のブラウザ上で、スクリプトが実行される。
なので、ブラウザ上でできることは何でも悪用可能。
CSRFの場合
CSRFの場合は、3のリクエストに対するサーバー側の処理を悪用するもの。
対策
重要なリクエストが正規の利用者が意図したものかを確認する必要がある。
- CSRF対策の必要なページを区別
- 正規利用者の意図したリクエストを確認できるように実装
クリックジャッキング
利用者が気づかないうちに攻撃対象のサイトでのクリックを誘導する攻撃手法。
対策
X-Frame-Optionsヘッダで、クリックジャッキング攻撃は防ぐことができる。