User Tools

Site Tools


ja:rule:out:外部へ出力するデータはデフォルトで全て無害化する

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:out:外部へ出力するデータはデフォルトで全て無害化する [2016/03/21 00:05] yohgakija:rule:out:外部へ出力するデータはデフォルトで全て無害化する [2017/10/25 00:20] (current) – コンテクストの解説追加 yohgaki
Line 27: Line 27:
  
 これらの何れかの手段を出力するデータ**全て**に適用する。 これらの何れかの手段を出力するデータ**全て**に適用する。
 +
 +出力先の無害化は”コンテクスト”によって異る。必ず適切な無害化方法を使用する。
 +
 +例:SQLの出力先コンテクスト
 +
 +  * パラメーター (パラメーター用エスケープまたはパラメーター用プレイスホルダ)
 +  * 識別子 (テーブル名、カラム名など。識別子用エスケープ)
 +  * SQL語句 (DESC、ASCなど。バリデーション)
 +パラメーターには更にコンテクストがある。全てのコンテクストに対して適切な無害化が必要
 +  * LIKEクエリ (LIKE用エスケープ)
 +  * 正規表現 (正規表現用エスケープ)
 +  * バイナリ型 (バイナリ型用エスケープ)
 +  * 配列型 (パラメーター用またはバイナリ型用のエスケープ)
 +  * JSON型 (JSON用エスケープ)
 +  * その他、全てのコンテクストに対して適切な無害化処理
  
 エスケープはコンテクストに合わせて行わなければならない。例えば、SQLインジェクション対策としてエスケープ/エスケープが必要ないAPIを利用しても、LIKEクエリや正規表現をサポートするDBMSの場合、LIKEクエリのエスケープ、正規表現のエスケープが必要となる。 エスケープはコンテクストに合わせて行わなければならない。例えば、SQLインジェクション対策としてエスケープ/エスケープが必要ないAPIを利用しても、LIKEクエリや正規表現をサポートするDBMSの場合、LIKEクエリのエスケープ、正規表現のエスケープが必要となる。
Line 74: Line 89:
 ?> ?>
 </code> </code>
 +
 +この非適合コードの場合、$idが整数値としてバリデーションされていることに依存したコードになっている。出力対策は入力対策とは独立して行う。
 +
  
 ===== 適合コード例 ===== ===== 適合コード例 =====
Line 107: Line 125:
 } }
 ?> ?>
 +</code>
  
 PostgreSQLの場合、pg_query_params()などのプリペアードクエリを利用しても良い。 PostgreSQLの場合、pg_query_params()などのプリペアードクエリを利用しても良い。
Line 136: Line 155:
 aaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaa
 </code> </code>
 +
 +SQLite3のカラムは整数型のプライマリーキーを除き、全て可変長テキスト型である。このため、この非適合コードはカラムデータ型定義の制限を越えた文字列を保存する。
 +
  
 ===== 適合コード例(Validation) ===== ===== 適合コード例(Validation) =====
Line 155: Line 177:
 </code> </code>
  
 +この適合コードは適切なバリデーションを行う。CHECK制約やデータ型が利用できるデータベースの場合、データベース側のバリデーション機能を利用し、クエリエラーを検出する方法も選択できる。
 +
 +
 +===== 非適合コード例(HTML) =====
 +
 +<code php>
 +<?php
 +$id = $_GET['id'];
 +if (!is_scalar($id) || strlen($id) > 8 || strspn($id, '1234567890') != strlen($id)) {
 +  throw new Exception('Invalid ID');
 +}
 +
 +
 +echo 'ID: '. $id . '<br />';
 +?>
 +</code>
 +
 +HTMLコンテクストへの出力に対しHTML用のエスケープを行っていない。
 +
 +===== 適合コード例(HTML) =====
 +
 +<code php>
 +<?php
 +$id = $_GET['id'];
 +if (!is_scalar($id) || strlen($id) > 8 || strspn($id, '1234567890') != strlen($id)) {
 +  throw new Exception('Invalid ID');
 +}
 +
 +// PHP 5.6以降のデフォルトの場合
 +echo 'ID: '. htmlspecialchars($id) . '<br />';
 +?>
 +</code>
 +
 +適合コードはコンテクストに対してエスケープ可能な全ての変数をコンテクスト用のエスケープを行う。エスケープしない変数は「エスケープできない変数」のみとする。HTMLコンテクストの場合、関数などで既に作られたHTML部品がエスケープできない変数である。
 +
 +エスケープできない変数はプログラムによって自動処理できるようにするか、変数名によってエスケープができない変数であることが判るようにする。
 +
 +エスケープできない変数を作成する場合、確実に安全な変数となるようにする。
  
 ===== 例外 ===== ===== 例外 =====
ja/rule/out/外部へ出力するデータはデフォルトで全て無害化する.1458518702.txt.gz · Last modified: 2016/03/21 00:05 by yohgaki

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki