Open8
[読書記録]体系的に学ぶ 安全なWebアプリケーションの作り方
3-1 HTTPとセッション管理
- 認証と認可の違い
- 認証: 利用者が確かに本人であることを何らかの方法で確認すること
- 認可: 認証済みの利用者に権限を与えること
3-2 受動的攻撃と同一オリジンポリシー
- 受動的攻撃
- webサイトの利用者に罠を仕掛けて、罠を閲覧したユーザを通してアプリケーションを攻撃する手法
- 同一オリジンポリシー
- 異なるオリジン間でのリソースアクセスを制限することでXSSやCSRFなどからユーザーを保護する
- ホスト名、スキーム、ポート番号が一致していること
3-3 CORS(Cross Origin Resource Sharing)
- クロスオリジン
- ウェブブラウザで異なるオリジン(ドメイン)間のリソースアクセスやデータのやり取り
- Access-Controll-Allow-Origin:許可するドメインだけで許可できる
- シンプルなリクエストの要件
- がちがちに決められてるの面白い
- WithCredentialsプロパティ
- ウェブページが他のサイト(オリジン)にデータを取りに行くときに、クッキーやログイン情報 を一緒に送るかどうかを決める設定
- サーバーは、
Access-Control-Allow-Credentials: true
ヘッダーを返す必要がある
4-2 入力処理とセキュリティ
- 文字エンコーディングの妥当性検証からはじまる
- 入力値検証
- バリデーション処理
- セキュリティのためではない
- アプリケーション要件にもとづいた基準になる
- 制御文字とは
- 改行やタブなど、通常表示されることのない文字のこと
4-3 表示処理に伴う問題
- 反射型XSS
- 持続型XSS
- XSS脆弱性が生まれる原因
- HTML生成の際にHTMLの文法上特別な意味を持つ特殊記号(メタ文字)を正しく扱っていないこと
- エスケープが必要
- htmlspecialchars便利
- HTML生成の際にHTMLの文法上特別な意味を持つ特殊記号(メタ文字)を正しく扱っていないこと
4-4 SQL呼び出しに伴う脆弱性
- 文字列リテラルをはみ出した部分からSQLインジェクションが発生
- 檻から出たライオンの例がわかりやすい
- 静的プレースホルダはプレースホルダの状態でSQL文がコンパイルされるためSQL文が後から変更される可能性は原理的にはない
4-5 重要な処理の際に混入する脆弱性
- CSRF攻撃対策
- CSRF対策の必要なページを区別する
- すべてのページに対策が必要なわけではない
- 正規利用者の意図したリクエストであることを確認する
- 第三者に予測不可能なトークンの埋め込み
- パスワード再入力
- Referer確認
- 保険的対策として確認メールの送信がある
- CSRF対策の必要なページを区別する
- クリックジャッキング
- 悪質すぎ
- X-Frame-Options
4-6 セッション管理の不備
- 推測、盗聴、強制
- セッションID生成を自前でやるな
- UR埋め込みのセッションIDがRefererによって漏洩する例
- 固定化攻撃
- 対策
- 認証後にセッションIDを変更する
- クッキーにセッションID保存する
- 認証前にはセッション変数に機密情報を保存しない
4-7 リダイレクト処理にまつわる脆弱性
- オープンリダイレクト脆弱性
- 原因
- リダイレクト先のURLを外部から指定できる
- リダイレクト先のドメイン名のチェックができない
- 対策
- リダイレクト先のURLを固定する
- リダイレクト先のURLを番号指定にする
- リダイレクト先のドメイン名をチェックする
- 原因
- HTTPヘッダー・インジェクション
- HTTPレスポンスヘッダの出力処理で発生する恐れのある脆弱性
- パラメータに改行を挿入することにより新たなHTTPレスポンスヘッダを追加する攻撃
- PHPのHTTPレスポンスヘッダ出力機能
- クッキー生成:setcookie/setrowcookie
- リダイレクト:なし(headerを利用)
- レスポンスヘッダ出力:header
4-8 クッキー出力にまつわる脆弱性
- クッキーの不適切な利用
- ユーザIDや権限情報は保存しない
- セッション変数に保存するべき
- クッキーのセキュア属性不備
- 直接の原因はセキュア属性をつけてないということだけ
- なぜつけていないのか→セキュア属性がつけられないアプリケーションがある
- HTTPとHTTPSが混在している場合
- なぜつけていないのか→セキュア属性がつけられないアプリケーションがある
- 直接の原因はセキュア属性をつけてないということだけ