ja:rule:out:エスケープの必要がないapiの制限を熟知する
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| ja:rule:out:エスケープの必要がないapiの制限を熟知する [2016/06/28 05:29] – [非適合コード例(Prepared query)] yohgaki | ja:rule:out:エスケープの必要がないapiの制限を熟知する [2016/06/28 06:56] (current) – [適合コード例(Validation)] yohgaki | ||
|---|---|---|---|
| Line 24: | Line 24: | ||
| <code php> | <code php> | ||
| + | <?php | ||
| + | $db = pg_connect(' | ||
| + | // SQL識別子(テーブル名、フィールド名など)は”(ダブルクオート)で括ってエスケープが必要 | ||
| + | $result = pg_query_params($db, | ||
| </ | </ | ||
| + | pg_escape_literal()関数は引数として渡された文字列をSQL識別子としてエスケープ(”は”でエスケープ)し、”で括った文字列を返します。 | ||
| - | ===== 非適合コード例(Execv, Execve) ===== | + | 識別子のエスケープ方法はSQLデータベースによって異なる場合があります。例えば、MySQLの場合は動作モードによってエスケープ方法が異なったりします。正しいエスケープ方法でエスケープします。 |
| + | |||
| + | 識別子を安全に処理するにはエスケープする方法以外に識別子として利用可能な文字でのみ構成されているかバリデーションする方法も利用できます。 | ||
| + | |||
| + | SQL識別子のエスケープ/ | ||
| + | |||
| + | |||
| + | ===== 非適合コード例(execv, execve) ===== | ||
| OSのシステムコールとしてexecv/ | OSのシステムコールとしてexecv/ | ||
| - | PHPの場合、pcntl_exec関数はexecv/ | + | PHPの場合、[[http:// |
| <code php> | <code php> | ||
| + | <?php | ||
| + | pcntl_exec('/ | ||
| </ | </ | ||
| + | |||
| + | 上記のコードには2つの問題がある。 | ||
| + | |||
| + | * execv, execveシステムコールはコマンドとその引数を分離するが、コマンド部分がインジェクションに脆弱である場合、安全性を維持できない。(SQLのプリペアードクエリにおけるプリペア文とパラメーターの関係と同じ) | ||
| + | * execv, execveシステムコールはコマンドとその引数を分離するが、コマンドに脆弱性がある場合、安全性を維持できない。(コマンドの引数を更に別のコマンドの引数に利用する場合などにこの問題が発生しうる。シェルスクリプトなどではこのような状況は容易に起こり得る) | ||
| + | |||
| ===== 適合コード例(Validation) ===== | ===== 適合コード例(Validation) ===== | ||
| + | |||
| + | 通常のホワイトリストによるバリデーションを行う。 | ||
| <code php> | <code php> | ||
| + | <?php | ||
| + | if (!isset($_GET[' | ||
| + | throw Exception(' | ||
| + | } | ||
| + | foreach($_GET[' | ||
| + | if (strspn($param, | ||
| + | throw Exception(' | ||
| + | } | ||
| + | } | ||
| + | |||
| + | pcntl_exec('/ | ||
| </ | </ | ||
| + | |||
| + | バリデーションの注意点 | ||
| + | |||
| + | * コマンド引数でパストラバーサルが可能な場合、任意コマンドに実行許してしまう。コマンドとして" | ||
| + | * パラメーター引数は指定したコマンドにより、更に別のコマンド実行に利用される可能性もある。この為、シェルの特殊文字を一文字でも許可するとリスクが発生する。文字種によるバリデーションより、特定の文字列のみをホワイトリスト形式でバリデーションする方がより安全性が高い。 | ||
ja/rule/out/エスケープの必要がないapiの制限を熟知する.1467091745.txt.gz · Last modified: 2016/06/28 05:29 by yohgaki
