변수에는 유동변수, 정적변수, 동적변수가 있습니다. 그리고 외부변수로 POST 변수, GET 변수가 있고, 사용자 값을 서버에 저장할 수 있는 세션변수나 쿠키변수 그 외 다양한 환경변수가 존재합니다.

변수의 역할이 무엇이며 어떤 정보가 저장되는지 살펴 보도록 하겠습니다.


CGI 환경변수

CGI 변수를 다른 말로 내장변수, 또는 자동전역변수라 부르기도 합니다. 내장변수는 서버에서 만들어 사용자에게 보여주는데, 내장변수 몇 가지를 소개하면 다음과 같습니다.

변수명 설 명
HTTP_USER_AGENT 접속자 브라우저 종류
HTTP_HOST 웹서버 호스트이름, 도메인이 없으면 ip주소를 사용
SERVER_SOFTWARE 웹서버 종류
SERVER_NAME 웹서버 호스트이름, 도메인이 없으면 ip 주소를 사용
SERVER_ADDR 웹서버 ip 주소
SERVER_PORT 웹서버가 제공하는 포트번호.
http일 경우 일반적으로 80
REMOTE_ADDR 사용자 ip 주소
DOCUMENT_ROOT 로컬파일 파일시스템 경로
SCRIPT_FILENAME php 실행파일 경로
SERVER_PROTOCOL 웹서버가 사용중인 이름과 HTTP버전
REQUEST_METHOD HTTP 페이지전송 방식
(GET 또는 POST)
QUERY_STRING 요청 URL의 ? 오른쪽 부분.
Ex.) http://expr.com/test.php?name=habony
REQUEST_URI 요청 URL에서 호스트이름이나 포트를 제외한 URL
SCRIPT_NAME 접속자가 보고 있는 페이지의 경로와 파일이름
PHP_SELF 접속자가 보고 있는 페이지의 경로와 파일이름
REQUEST_TIME 로컬시간(timestamp)을 출력.
time()함수와 같은 역할을 하며, php5.1부터 지원합니다.
HTTP_REFERER 현제 페이지로 오기 전의 이전 페이지주소

HTTP_ 로 시작하는 변수는 헤더변수로서 브라우저의 요청에 의하거나 사용자에 의해 만들어 집니다.

다만, HTTP_ 로 시작하는 변수는 사용자에 의해 변조가 가능하다는 점에 주의가 필요합니다.

헤더변수에는 사용자 컴퓨터의 환경 정보가 담겨져 있습니다. 이를 통해 사용자의 브라우저 종류나 언어, ip주소, 접속경로를 알아 낼 수 있습니다.

<?php 
 if("ko" == strtolower(getenv('HTTP_ACCEPT_LANGUAGE'))) { 
       echo "접속하신 브라우저가 한글입니다."; 
 } 
 ?>

변수이름이나 변수이름 앞에 붙는 $_SERVER 나 $HTTP_SERVER_VARS 는 대문자로 표현해야 하며, php.ini 의 register_globals가 off 이면 변수 이름만으로는 사용할 수 없게 됩니다.

아래 예제를 한번 보죠.

<?php 
 echo getenv('HTTP_HOST'); 
 echo $_SERVER['HTTP_HOST']; 
 echo $HTTP_SERVER_VARS['HTTP_HOST']; 
 echo $HTTP_HOST; //  register_globals가 off 이면 사용 불가 

 // 결과: 127.0.0.1 
 ?>

편리해 보이긴 하지만 보안의 중요성을 생각한다면 register_globals 를 Off 로 해두는 게 좋습니다.

서버의 모든 환경 변수 목록을 보고 싶다면 phpinfo() 로 확인하세요.

<?php 
      phpinfo(INFO_VARIABLES); 
 ?>

이렇게 선언된 변수는 다음과 같은 방법으로 가져올 수 있습니다.

  • $HTTP_SERVER_VARS['환경변수'];
  • $_SERVER['환경변수'];
  • $GLOBALS['_SERVER']['환경변수'];
  • getenv['환경변수'];

PHP는 스크립트에 사용되는 상당한 환경변수를 제공합니다.

하지만, 이 변수의 대부분은 운영되는 서버, 서버의 버전, 서버의 설정, 다른 팩터와 관련되어 있어서 보안에 문제가 될 수 있습니다.

그런 이유로 PHP 4.2.0 이후 버전부터, php.ini인 register_globals 의 기본값이 off 로 셋팅됩니다.

register_globals 를 off 로 놓으면, 전역 유효영역 안의 미리 선언된 변수 집합들에 영향을 미치는데, 예를 들면, DOCUMENT_ROOT값을 얻기 위해서는 $DOCUMENT_ROOT 대신에 $_SERVER['DOCUMENT_ROOT']를, 외부 변수로 가져 온 변수 $id 대신에 $_GET['id'] 나 $_POST['id']를, $HOME 대신에 $_ENV['HOME']을 사용해야 합니다.

서버를 아파치로 모듈로 사용한다면, 다음 아파치 함수로 환경 변수를 가져올 수 있습니다.

<?php 
 // 아파치 모듈로 모든 HTTP 요청 헤더를 가져옵니다. 
 if (!function_exists('apache_request_headers')) {  
        function apache_request_headers() {  
            foreach($_SERVER as $key=>$value) {  
                if (substr($key,0,5)=="HTTP_") { 
                    $key=str_replace(" ","-",ucwords(strtolower(str_replace("_"," ",substr($key,5)))));  
                    $out[$key]=$value;  
                }else{  
                    $out[$key]=$value;  
                }  
            }  
            return $out;  
        } 
 }  
 print_r(apache_request_headers()); 
 /* 
 결과: 
 Array 
 ( 
    [Accept] => */* 
    [Accept-Language] => ko 
    [Accept-Encoding] => gzip, deflate 
    [User-Agent] => Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) 
    [Host] => 127.0.0.1 
    [Connection] => Keep-Alive 
 ) 
 */ 


 // 개별 환경변수를 가져옵니다. 
 $ret = apache_getenv("SERVER_ADDR"); 
 echo $ret; // 결과: 127.0.0.1 
 ?>

다음은 전송된 헤더 목록을 가져오는 함수입니다.

<?php 
 // 아파치 모듈로 모든 HTTP 요청 헤더를 가져옵니다. 
 // 넷스케이프/iPlanet/SunONE NSAPI 서버 모듈에서도 사용할 수 있습니다. 
 // getallheaders()도 같은 역할을 합니다. 
 if (!function_exists('apache_response_headers')) { 
    function apache_response_headers () { 
        $arh = array(); 
        $headers = headers_list(); 
        foreach ($headers as $header) { 
            $header = explode(":", $header); 
            $arh[array_shift($header)] = trim(implode(":", $header)); 
        } 
        return $arh; 
    } 
 } 
 foreach (apache_response_headers() as $name => $value) { 
    echo "$name: $value\n"; 
 } 
 /* 
 결과: 
 Accept-Ranges: bytes 
 X-Powered-By: PHP/4.3.8 
 */ 
 ?>

아파치 함수로 강제적으로 ip를 바꾸어 테스트해 보았는데, $_SERVER 에 영향을 주지 않음을 알 수 있습니다. 이 결과는 HTTP_ 로 시작하는 변수 외에는 변조가 어렵습니다.

<?php  
 echo apache_getenv('SERVER_ADDR'); // 결과: 127.0.0.1 


 // ip 환경변수를 강제적으로 바꿉니다. 
 apache_setenv("SERVER_ADDR", "192.168.0.2"); 


 echo apache_getenv('SERVER_ADDR'); // 결과: 192.168.0.2 


 // 아파치 함수로 환경변수를 정의하여도 
 // 미리 정의된 변수에는 영향을 받지 않습니다. 
 echo $_SERVER['SERVER_ADDR']; // 결과: 127.0.0.1 
 ?>

0 댓글