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 06:14] – [適合コード例(Escape)] yohgaki | ja:rule:out:エスケープの必要がないapiの制限を熟知する [2016/06/28 06:56] (current) – [適合コード例(Validation)] yohgaki | ||
|---|---|---|---|
| Line 39: | Line 39: | ||
| - | ===== 非適合コード例(Execv, Execve) ===== | + | ===== 非適合コード例(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の制限を熟知する.1467094451.txt.gz · Last modified: 2016/06/28 06:14 by yohgaki
