1

$GLOBALS空の配列に設定するだけで問題はありますか? register_globalsオンになっていてファイルにアクセスできない場所の効果を逆にしたいのですが、通常行われている.iniように、関連する各スーパーグローバルを反復して必要に応じて設定を解除し、などの要素をスキップし$GLOBALS['_POST']ます$GLOBALS['_GET']、全部外していいのかしら。

これから発生する可能性のある問題はありますか?$GLOBALSスコープに依存しない変数は、関連するスーパー グローバル ( 、 など) に設定されるか、関連するレジストリ クラスのプロパティとして格納されるため、配列$_GET$_POST参照する予定はありません。

詳細については、http: //www.php.net/manual/en/faq.misc.php#faq.misc.registerglobals の FAQ には、エミュレートする次のものがありますregister_globals = 0

<?php
// Emulate register_globals off
function unregister_GLOBALS()
{
    if (!ini_get('register_globals')) {
        return;
    }

    // Might want to change this perhaps to a nicer error
    if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
        die('GLOBALS overwrite attempt detected');
    }

    // Variables that shouldn't be unset
    $noUnset = array('GLOBALS',  '_GET',
                     '_POST',    '_COOKIE',
                     '_REQUEST', '_SERVER',
                     '_ENV',     '_FILES');

    $input = array_merge($_GET,    $_POST,
                         $_COOKIE, $_SERVER,
                         $_ENV,    $_FILES,
                         isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());

    foreach ($input as $k => $v) {
        if (!in_array($k, $noUnset) && isset($GLOBALS[$k])) {
            unset($GLOBALS[$k]);
        }
    }
}

unregister_GLOBALS();

?>

おそらく、実行unset($GLOBALS[$k]);は実行と同じ$GLOBALS = array();ですが、後者はすべてを削除し、1行のコードのみを含みます。

$GLOBALS['_GET']問題は次のとおりです。 、などを設定解除するのは悪いこと$GLOBALS['_PUT']ですか?

アップデート:

私はこれに以下で答えました。以前に試していないのはばかげています。

4

2 に答える 2

2

PHPマニュアルによると

$GLOBALS — References all variables available in global scope

「参照」という単語が典型的な PHP の方法で使用されている場合、設定$GLOBALS=array()は役に立ちません。次のものが必要になります。

foreach ($GLOBALS as $k=>$v) unset($$k);

編集:これは次のように拡張できます

foreach ($GLOBALS as $k=>$v) 
  if (substr($k,0,1)!='_')
    unset($$k);

安全のために!(試していません)

編集2:

Karolyのコメントから、クラスまたは関数でこれを行う場合は、

foreach ($GLOBALS as $k=>$v) {
  global $$k;
  unset($$k);
}

編集3は途中で編集されました

.. 太い指が含まれていたため - 予想外の結果はタイプミスによるものでした!

于 2012-05-14T10:25:09.517 に答える