人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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


●質問者: xptree
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● TransFreeBSD
●50ポイント

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

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


2 ● oil999
●50ポイント

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

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

PHPの変数 - 基本的なこと

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

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

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

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

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ