配列の各要素を個別に変数へインポートする(PHP)

連想配列の各要素を個別の変数にするのに今までは、

foreach( $arr as $key => $value ) { $$key = $value; }

でやってたけど、

extract( $arr );

でできたのね・・・。
どっちも1行だからあまり変わらないけど、後者の方はスマートっぽく見える。(゜д゜

ただ、PHP: extract – Manualにも

extract() をユーザー入力 ($_GET や $_FILES など) のような信頼できないデータについて使用しないでください。 もし行う場合、例えば register_globals を信頼しているような古いコードを一時的に実行したい場合、 EXTR_SKIP のような extract_type の値が上書きされていないことを確認してください。そして php.ini の variables_order で定義されたものと同じ順で展開すべきであることに留意してください。

と書いてあるように$_GETや$_POSTで使うのは、ちょっと怖ひ。

極端な例を挙げるとすると、下記のような身長と体重の数値を送ってBMI値を計算する処理を作ったとしても

hoge.php?bmi=30

$weight = $_POST['weight'];
$height = $_POST['height'];

// BMI値 = 体重[Kg] ÷ (身長[m]×身長[m])
$bmi = $weight / ( $height * $height );

extract( $_GET ); // ここで$bmi=30となる!

if ( $bmi > 22 ) {
echo "デブ!";
}
「?bmi=30」とアクセスされたら、身長・体重にかかわらずあなたは常に「デブ!」である。

こんな風にユーザが変数の値を任意に操作することが可能になるので、常にデブと言われるだけならまだしも、SQL文や処理の大事なフラグも変更される恐れがありセキュリティ上好ましくない。

まぁ、使いどころに気をつけましょうというお話。

大阪の江坂でウェブ制作をしている、インフラもシステムもデザインもディレクションもできるエンジニア。 広く浅く薄っぺらくですが(笑)

Leave a reply:

Your email address will not be published.