if ($_SERVER["REQUEST_METHOD"] == "POST") {
foreach($_POST as $key => $value){
$$key = $value;
}
上記のようにループで全て変数に代入した場合に起こりうるデメリット、セキュリティの脆弱性、考えられる攻撃手法などご教示頂けますと幸いです。
$data1 = $_POST['data1'];
$data2 = $_POST['data2'];
このように個別に指定して代入した方がセキュリティ的に優れているはずですが、
最初の例のようにループで全て変数に代入してしまった場合に起こりうるデメリット、セキュリティの脆弱性、考えられる攻撃手法などご教示頂けますと幸いです。
宜しくお願いいたします。
例としては下記の例1が当てはまるかと思います。
http://www.php.net/manual/ja/security.globals.php
また、具体的な攻撃手法を知らないので再現できるかはわかりませんが、$GLOBALを上書きする攻撃手法もあるようです。
http://www.konekto.jp/tech/index.php?Tips%2FPHP%2F%24GLOBAL%A4%CE%C0%C8%BC%E5%C0%AD
この他、ありがちなのは定数的に使用する目的でファイル名やSQLを代入していた変数があると、ディレクトリトラバーサル、SQLインジェクションなどの脆弱性が発生します。
また直接脆弱性とならなくとも、これ以降はすべての変数の値は信用できなくなりますので、たとえば数値が入っていた変数に文字列を入れられてしまうことで例外が発生するなどがあり得ます。
これらを防ぐには、使用する変数は必ず初期化するか、バリデーションを行うことになると思いますが、それらに落ちがあるためにバグとなっているというのはありがちなパターンです。
また、結局バリデーションするのであれば、個別に指定して代入する手間は誤差みたいなものでしょう。
あとは、個別に代入なりホワイトリストなりを使うのは、インターフェースの明確化という働きも期待できます。
その変数を何に使うか分からないと、具体的なデメリットや脆弱性を論じることはできません。
ご質問のように個別に代入したとしても、その値をそのまま表示やSQLに渡しているとしたら、脆弱性問題は軽減されません。
単純に名前をkeyとして渡して生じる最大のデメリットを考えると、PHPで使えない変数名が渡る場合があるので、スクリプト・エラーが発生することです。
エラーメッセージ表示可能状態にしておくと、スクリプトを解析され、脆弱性を発見されるリスクが高まります
http://jp.php.net/manual/ja/language.variables.basics.php
一般論として、POSTで渡された値は、変数名に使うにしろ変数に格納するにしろ、バリデーションチェックを行うのが定石です。
コメント(0件)