سؤال

لست متأكدا مما إذا كان هذا سيكون من الجيد أن تكون ملحوظة كمعيادة المجتمع، ولكن على أي حال:

هل هناك طريقة سهلة لقتل السجل_globals؟ أنا أعمل على إطار PHP والآن، قمت فقط بتعيين البرنامج النصي لإنهاء إذا كان Recorder_Globals قيد التشغيل. على الرغم من أنني أفضل إجبار الناس على تعطيلها، هناك نكون الخوادم التي لا تزال لديها ذلك على.

أعلم أنه في PHP 5.3.0 Register_globals يتم إهماله وفي 6 فب 6، سيتم إزالته بالكامل، لكنه دائما شيء جيد للتعامل معه بينما لا يزال هنا.

رأيت بعض الطرق، وأنا أفكر حاليا في استخدام هذا:

$ temp = array_merge ($ _ الحصول عليها، $ _post، $ _Cookie)؛ foreach ($ temp as de k => $ v) {if }

هناك بعض المشاكل هنا، رغم ذلك. إنه حافز من الموارد، خاصة عندما يكون هناك الكثير من بيانات الإدخال. لست متأكدا مما إذا كان تعطيله في وقت التشغيل سيعمل، على سبيل المثال:

ini_set('register_globals', 'Off')

هل هناك طريقة أفضل لم أسمع بها للتخلص من Register_globals؟ شكرا.

هل كانت مفيدة؟

المحلول

هناك طرق التعامل مع Register_Globals الموصوفة في دليل PHP. وبعد ال register_globals الإعداد INI. لا يمكن ضبطها في وقت التشغيل بواسطة ini_set(), ، لذلك إذا لم تتمكن من القيام بذلك باستخدام ملف تكوين خادم .htaccess أو خادم الويب، فستكون الطريقة المقدمة هناك الحلول الرسمية.

يوفر أساسا هذا القصاصات من التعليمات البرمجية لمحاكاة التوافق:

<?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