質問

これがコミュニティウィキとしてマークされるのが良いかどうかはわかりませんが、とにかく:

Register_globalsを殺す簡単な方法はありますか?私はPHPフレームワークに取り組んでいますが、今はスクリプトを設定して、Register_Globalsがオンになっている場合に終了します。私は人々にそれを無効にすることを強制することを好みますが、そこに それは まだそれを持っているサーバー。

PHP 5.3.0 Register_Globalsが非推奨であり、PHP 6では完全に削除されることを知っていますが、まだここにいる間、それに対処するのは常に良いことです。

私はいくつかの方法を見ました、そして私は現在これを使用することを考えています:

$temp = array_merge($_GET, $_POST, $_COOKIE);
foreach($temp as $k => $v) {
    if(isset($$k)) unset($$k);
}

ただし、ここにはいくつかの問題があります。特に多くの入力データがある場合、これはリソースのインセンティブです。たとえば、ランタイムで無効にすることが機能するかどうかはわかりません。

ini_set('register_globals', 'Off')

Register_globalsを取り除くために聞いたことがないより良い方法はありますか?ありがとう。

役に立ちましたか?

解決

Register_globalsを扱う方法があります PHPマニュアルで説明されています. 。 register_globals ini設定 実行時に設定することはできませんini_set(), 、したがって、.htaccessまたはwebサーバー構成ファイルでそれを行うことができない場合、公式の回避策があると提供される方法。

基本的に、このコードのスニペットを提供して、互換性をエミュレートします。

<?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();

?>

他のヒント

追加できます php_flag register_globals off .htaccessファイルに、すべてのサーバーがこれを受け入れるわけではありません。したがって、フレームワークを公開する予定がある場合は、それは良い考えではないかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top