User Tools

Site Tools


ja:rule:出力

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
ja:rule:出力 [2016/03/03 21:35] yohgakija:rule:出力 [2017/07/04 01:30] (current) – [出力] yohgaki
Line 1: Line 1:
 ====== 出力 ====== ====== 出力 ======
  
-  * [[.:外部へ出力するデータはデフォルトで全て無害化する]] +安全な出力には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原則により「出力先のシステム/コードで不正な命令」が実行されることは防止できる。しかし、プログラムにとって「不正な値」が保存・利用されることは防げない。 
 + 
 +例: 整数IDに文字列が表示されることを出力対策では防げない 
 + 
 +<code php> 
 + echo 'ID: '. htmlspecialchars($_GET['id']); 
 +</code> 
 + 
 +これは出力対策は入力データのコンテクストを識別できないことが理由である。入力データのコンテクスト($_GET['id']のデータのコンテクストなど)は入力対策で識別・検証することができる。ソフトウェアには入力仕様があり、入力コンテクストでは入力仕様によって「不正なデータ」を完全に排除できる。 
 + 
 +入力データには3種類が存在する。 
 + 
 +  * **正しいデータ** 
 +  * **入力ミスのデータ** 
 +  * <color #ed1c24>**不正なデータ**</color> 
 + 
 +「不正なデータ」を正しく処理する責任は入力処理コードが、「入力ミスのデータ」を正しく処理する責任はビジネスロジック(MVCのモデル)が所有する。 
 + 
 +===== ルール ===== 
 + 
 +  * [[.:out:外部へ出力するデータはデフォルトで全て無害化する]] 
 +  * [[.:out:SQLクエリを無害化する]] 
 +  * [[.:out:LDAPクエリを無害化する]] 
 +  * [[.:out:XPATHクエリを無害化する]] 
 +  * [[.:out:HTML出力を無害化する]] 
 +  * [[.:out:JavaScript文字列を無害化する]] 
 +  * [[.:out:JSON文字列を無害化する]] 
 +  * [[.:out:コマンド文字列を無害化する]] 
 +  * [[.:out:正規表現文字列を無害化する]] 
 +  * [[.:out:mail送信を無害化する]] 
 +  * [[.:out:ファイルパスを無害化する]] 
 +  * [[.:out:出力バリデーションにブラックリスト方式を用いない]] 
 +  * [[.:out:エスケープの必要がないAPIの制限を熟知する]] 
 +  * [[.:out:入力処理時のバリデーションを出力処理時のバリデーションとしない]] 
 +  * [[.:out:PCREメタ文字のエスケープはデリミター文字を指定する]] 
 +  * [[.:out:]] 
 + 
 +===== 注意事項 ===== 
 + 
 +出力対策は入力対策と”**独立**”した対策である。出力対策は入力対策と無関係に実施しなければならない。 
ja/rule/出力.1457040918.txt.gz · Last modified: 2016/03/03 21:35 by yohgaki

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki