문제

이것이 커뮤니티 위키로 표시되는 것이 좋을지 확실하지 않지만 어쨌든 :

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 또는 웹 서버 구성 파일로 할 수 없다면 공식 해결 방법이 제공되는 메소드가 있습니다.

기본적 으로이 코드 스 니펫을 제공하여 호환성을 모방합니다.

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