php
PHP - 환경변수
변수에는 유동변수, 정적변수, 동적변수가 있습니다. 그리고 외부변수로 POST 변수, GET 변수가 있고, 사용자 값을 서버에 저장할 수 있는 세션변수나 쿠키변수 그 외 다양한 환경변수가 존재합니다.
변수의 역할이 무엇이며 어떤 정보가 저장되는지 살펴 보도록 하겠습니다.
HTTP_ 로 시작하는 변수는 헤더변수로서 브라우저의 요청에 의하거나 사용자에 의해 만들어 집니다.
다만, HTTP_ 로 시작하는 변수는 사용자에 의해 변조가 가능하다는 점에 주의가 필요합니다.
헤더변수에는 사용자 컴퓨터의 환경 정보가 담겨져 있습니다. 이를 통해 사용자의 브라우저 종류나 언어, ip주소, 접속경로를 알아 낼 수 있습니다.
변수이름이나 변수이름 앞에 붙는 $_SERVER 나 $HTTP_SERVER_VARS 는 대문자로 표현해야 하며, php.ini 의 register_globals가 off 이면 변수 이름만으로는 사용할 수 없게 됩니다.
아래 예제를 한번 보죠.
편리해 보이긴 하지만 보안의 중요성을 생각한다면 register_globals 를 Off 로 해두는 게 좋습니다.
서버의 모든 환경 변수 목록을 보고 싶다면 phpinfo() 로 확인하세요.
이렇게 선언된 변수는 다음과 같은 방법으로 가져올 수 있습니다.
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']을 사용해야 합니다.
서버를 아파치로 모듈로 사용한다면, 다음 아파치 함수로 환경 변수를 가져올 수 있습니다.
다음은 전송된 헤더 목록을 가져오는 함수입니다.
아파치 함수로 강제적으로 ip를 바꾸어 테스트해 보았는데, $_SERVER 에 영향을 주지 않음을 알 수 있습니다. 이 결과는 HTTP_ 로 시작하는 변수 외에는 변조가 어렵습니다.
변수의 역할이 무엇이며 어떤 정보가 저장되는지 살펴 보도록 하겠습니다.
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 댓글