SelfScribe

PHPのregister_globalsオプションを再現する

register_globals

リクエストパラメータが自動でグローバル変数にセットされるもの

ただの害悪
古いPHPの環境をアップグレードする際にregister_globalsを前提とした処理になってると見る気も失せるのは致し方なし

再現スクリプト

以下のスクリプトをauto_prepend_file等で読ませる

<?php
// $_FILESだけそのままextractで対応できないので別処理
$files_variables = ['name', 'type', 'size'];
foreach($_FILES as $fkey => $fval){
    $$fkey = $fval['tmp_name'];

    $keys = array_map(fn($n) => $fkey. '_'. $n, $files_variables); 
    $vals = array_map(fn($n) => $fval[$n], $files_variables);

    extract(array_combine($keys, $vals));
}

// 順序的に$_SESSIONが先
if( isset($_SESSION) ){
    extract($_SESSION, EXTR_SKIP);
}

// その他 - variables_orderに応じて処理
$ini_variables = ['e' => '_ENV', 's' => '_SERVER', 'c' => '_COOKIE', 'p' => '_POST', 'g' => '_GET'];
$ini_variables_order = strtolower(ini_get('variables_order'));
foreach(str_split($ini_variables_order) as $r){
    $tmp = $ini_variables[$r];
    extract($$tmp);
}

詰めたver

<?php
$files_variables = ['name', 'type', 'size'];
foreach($_FILES as $fkey => $fval){
    $$fkey = $fval['tmp_name'];
    extract(array_combine(array_map(function($n) use($fkey){ return $fkey. '_'. $n; }, $files_variables), array_map(function($n) use($fval){ return $fval[$n]; }, $files_variables)));
}
$ini_variables = ['e' => '_ENV', 's' => '_SERVER', 'c' => '_COOKIE', 'p' => '_POST', 'g' => '_GET'];
$ini_variables_order = ini_get('variables_order');
if( isset($_SESSION) ) extract($_SESSION, EXTR_SKIP);
foreach(str_split($ini_variables_order) as $r) extract(${$ini_variables[strtolower($r)]});
?>

Published at: 2025-02-13

Auther: *Ly_sTel

Category: PHP

#php

Fullsized Image