phpに関する質問です。formからpostされた値を

if ($_SERVER["REQUEST_METHOD"] == "POST") {
foreach($_POST as $key => $value){
$$key = $value;
}
上記のようにループで全て変数に代入した場合に起こりうるデメリット、セキュリティの脆弱性、考えられる攻撃手法などご教示頂けますと幸いです。

$data1 = $_POST['data1'];
$data2 = $_POST['data2'];

このように個別に指定して代入した方がセキュリティ的に優れているはずですが、
最初の例のようにループで全て変数に代入してしまった場合に起こりうるデメリット、セキュリティの脆弱性、考えられる攻撃手法などご教示頂けますと幸いです。
宜しくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/10/18 12:30:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:TransFreeBSD No.1

回答回数668ベストアンサー獲得回数268

ポイント50pt

例としては下記の例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インジェクションなどの脆弱性が発生します。
また直接脆弱性とならなくとも、これ以降はすべての変数の値は信用できなくなりますので、たとえば数値が入っていた変数に文字列を入れられてしまうことで例外が発生するなどがあり得ます。

これらを防ぐには、使用する変数は必ず初期化するか、バリデーションを行うことになると思いますが、それらに落ちがあるためにバグとなっているというのはありがちなパターンです。
また、結局バリデーションするのであれば、個別に指定して代入する手間は誤差みたいなものでしょう。
あとは、個別に代入なりホワイトリストなりを使うのは、インターフェースの明確化という働きも期待できます。

id:oil999 No.2

回答回数1728ベストアンサー獲得回数320

ポイント50pt

その変数を何に使うか分からないと、具体的なデメリットや脆弱性を論じることはできません。
ご質問のように個別に代入したとしても、その値をそのまま表示やSQLに渡しているとしたら、脆弱性問題は軽減されません。

単純に名前をkeyとして渡して生じる最大のデメリットを考えると、PHPで使えない変数名が渡る場合があるので、スクリプト・エラーが発生することです。
エラーメッセージ表示可能状態にしておくと、スクリプトを解析され、脆弱性を発見されるリスクが高まります

PHPの変数 - 基本的なこと

http://jp.php.net/manual/ja/language.variables.basics.php

一般論として、POSTで渡された値は、変数名に使うにしろ変数に格納するにしろ、バリデーションチェックを行うのが定石です。

cakePHPで複数パターンのバリデーションチェック

http://d.hatena.ne.jp/ichikaway/20080813/1218596136

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません