This is an old revision of the document!
出力
安全な出力には3つの方法がある
出力の3原則
- エスケープ - 出力先のシステムが誤作動しない確実に安全な形式にエンコーディングする
- 安全なAPI - 出力先のシステムが誤作動しない確実に安全なAPIを安全な方法で利用する
- バリデーション - 出力先のシステムが誤作動しない確実に安全な形式であることを検証する
出力の3原則により「出力データによって出力先が誤作動しない」ことを保証できる。出力先にはコンテクストがあり、出力の3原則はどれか一つ使えば良いものでない。コンテクスト、利用できるAPIなどをコンテクストに合わせて適切に利用しなければならない。
出力対策は入力対策と独立した対策である。全ての出力データは出力コードで確実に安全に出力できることを保証しなければならない。
セキュアコーディングの目的は「プログラムが正しく動作することを保証する**」ことである。出力対策だけではこの目的を達成できない(入力対策が必須)であることも理解する。 例: 不正なデータをエスケープしたりプリペアードクエリを使っても不正なデータを保存・利用することを防げない。 <code php> $address = '<script>alert(“You are hacked!”)</script>'; pg_query('INSERT INTO mytable (address) VALUES '.pg_escape_literal($address).';'); pg_query_params('INSERT INTO mytable (address) VALUES $1;', [$address]); </code> 出力の3原則により ===== ルール ===== * 外部へ出力するデータはデフォルトで全て無害化する * 出力バリデーションにブラックリスト方式を用いない * エスケープの必要がないAPIの制限を熟知する * 入力処理時のバリデーションを出力処理時のバリデーションとしない * PCREメタ文字のエスケープはデリミター文字を指定する ===== 注意事項 ===== 出力対策は入力対策と”独立**”した対策である。出力
