PHP


게시글 'extract() 언제, 왜 사용하는것일까?'에 대한 정보
extract() 언제, 왜 사용하는것일까?
등록일 2009-12-02 조회 4,184
php.ini 파일에 register_globals 라는 설정과 관련있습니다.

register_globals 라는 설정이 on 으로 설정되어 있을 때는 현재 페이지로 전달되는 변수 및 서버 변수들을 이름 그대로 사용하실 수 있습니다.
하지만 반대로 off 로 설정되어 있을 때는 불가능 합니다.

PHP 4.2.0 버전 부터 이 register_globals 라는 설정이 off 를 기본 값으로 배포가 되고 있습니다.

그 이유는 보안상의 문제 때문입니다.

<?
if(check_login()) {
   $login_ok = true;
}

if($login_ok) {
   echo "로그인 되었습니다.";
}
?>

 

위 소스를 보시면 check_login() 이란 함수에서 true 값이 리턴되어야만 $login_ok 에 true 가 대입되고 그 아래 "로그인 되었습니다." 라는 문구가 출력됩니다.

하지만 만약 register_globals=on 이고 브라우저 주소창에 'test.php?login_ok=1' 이라고 입력했을 때도 "로그인 되었습니다." 라는 문구가 출력이 되게 됩니다.

이런 문제를 해결하는 방법은 2가지가 있습니다.

register_globals 를 off 로 설정을 함으로써 주소를 통해 넘어가는 변수는 $_GET 을 이용해 접근할 수 있도록 하던가...위 예제 소스 제일 상단에 $login_ok = false; 라는 라인을 추가하는 방법입니다.

두가지 방법 모두 문제를 해결하기는 하나 이런식으로 보만 문제를 고민을 할 바에는 register_globals 를 off 로 설정하고 각 변수에 접근시는 알맞는 슈퍼전역변수를 사용하라는 것입니다.

 

슈퍼전역변수$GLOBALS, $_SERVER, $_GET, $_POST, $_COOKIE, $_SESSION, $_FILES, $_ENV, $_REQUEST 이있습니다. 이 변수에 대한 자세한 설명은 http://kr.php.net/manual/kr/language.variables.predefined.php 페이지를 참고 해보시기 바랍니다.

 

이렇게 register_globals = off 일 때는 이전 페이지에 폼을 통해 넘어오는 $name 값을 사용하기 위해서는 $_POST[name] 또는 $HTTP_POST_VARS[name] 으로 접근을 하셔야지만 사용이 가능합니다.

하지만 프로그램어 입장에선 이 프로그램이 사용되는 서버의 php 설정이 어떻게 되어 있는지 모르고 이전 소스 전체를 수정하는 것이 힘들기 때문에 소스 상단에 extract() 함수를 사용해서 슈퍼전역변수를 변수명 그대로 사용할 수 있도록 풀어주는 것입니다.