문제
이것이 커뮤니티 위키로 표시되는 것이 좋을지 확실하지 않지만 어쨌든 :
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 파일에. 따라서 프레임 워크를 게시 할 계획이라면 좋은 생각이 아닐 수도 있습니다.