호스팅 서버 같은 곳에서 보안상의 이유로 register_globals 를 OFF 로 변경
하거나 또는 보안상 register_globals 를 OFF 로 변경하고 싶은데 기존의 소
스들 때문에 망설이시는 분들께 유용한 함수가 될것 같네요.
테스트 환경은 다음과 같이 하시면 이해가 쉬울 것 같습니다. 일단 php.ini
에서 register_globals = Off 로 설정을 한뒤에 아파치를 재시작 합니다. 다
음 간단하게 웹루트에 test_query.php 라는 스크립트를 하나 만듭니다.
--------- cut here test_query.php -----------
<?
function parse_query_str($level=0) {
# php.ini 의 register_globals 값을 확인한다.
# register_globals = OFF 일 경우만 작동.
if(ini_get("register_globals")) return;
# php 버젼이 4.1 보다 낮을 경우에는 함수 안에서 trackvar
# 를 사용하기 위해 global 로 지정해 줘야 한다.
if(substr(PHP_VERSION,0,3) < 4.1) {
global $HTTP_GET_VAR, $HTTP_POST_VARS;
$O_GET = $HTTP_GET_VARS;
$O_ENV = $HTTP_ENV_VARS;
$O_POST = $HTTP_POST_VARS;
if($level) {
global $HTTP_COOKIE_VARS,$HTTP_SESSION_VARS,$HTTP_SERVER_VARS;
$O_SERVER = $HTTP_SERVER_VARS;
$O_COOKIE = $HTTP_COOKIE_VARS;
$O_SESSION = $HTTP_SESSION_VARS;
}
} else {
$O_GET = $_GET;
$O_ENV = $_ENV;
$O_POST = $_POST;
if($level) {
$O_SERVER = $_SERVER;
$O_COOKIE = $_COOKIE;
$O_SESSION = $_SESSION;
}
}
# 4.1 부터는 trackvars 에 대해 무조건 배열로 생성을 하기
# 때문에 is_array() 함수 보다는 count() 함수로 배열의 수를
# 체크한다.
if(count($O_GET)) {
foreach($O_GET as $key => $value) {
global ${$key};
${$key} = $value;
}
}
if(count($O_POST)) {
foreach($O_POST as $key => $value) {
global ${$key};
${$key} = $value;
}
}
if( $level && count($O_COOKIE) ) {
foreach($O_COOKIE as $key => $value) {
global ${$key};
${$key} = $value;
}
}
if( $level && count($O_SESSION) ) {
foreach($O_SESSION as $key => $value) {
global ${$key};
${$key} = $value;
}
}
if( $level && count($O_SERVER) ) {
foreach($O_SERVER as $key => $value) {
global ${$key};
${$key} = $value;
}
}
}
# POST, GET 만 제어한다.
parse_query_str();
echo "$a<br>\n$b<br>\n$c<br>\n";
# POST, GET , COOKIE, SESSION, SERVER_var 를 모두 제어한다.
parse_query_str(1);
echo "$PHP_SELF\n";
?>
--------- cut here test_query.php -----------
다음 http://domain.com/test_query.php 를 웹브라우져로 호출을 합니다. 결
과는 소스의 parse_query_str() 함수를 호출을 할 때와 안할 때의 차이를 보
시면 알겁니다.
위와 같이 이용을 하면 register_globals 의 값을 On 으로 두던 Off 로 두던
보안을 강화하면서 register_globals 의 값에 상관없이 register_globals 의
값이 On 일때 처럼 코딩을 할 수 있게 됩니다.
이 함수가 보안을 위하여 register_globals 의 값을 Off 로 두는것에 어떠한
작용을 하게 될지에 대해서는 검증이 되지는 않았습니다만 일단 넘어오는 값
을 GET 이면 GET 으로 넘어온 값을 조절하고 POST 이면 POST 의 값을 조절하
기 때문에 크게 위배되지는 않을것 같습니다.
원래는 GET 과 POST 로 넘어오는 값을 하나의 배열로 return 하는 방법이 더
낳을것 같지만 그렇게 되면 기존의 소스를 너무 수정을 해야 하기 때문에 위
와 같은 식으로 전역 변수화 처리를 한 것입니다. ^^;
- http://www.oops.org 에서 가져왔습니다 -
php.ini에서 절대로 register_globals=On 으로 하면 안됩니다.
이는 보안에 심각하게 위배되며, register_globals=On으로 설정된 상태의 php는 더 이상 스크립트 언어로써의 가치가 없다고까지 이야기하는 사람도 있습니다.
그럼 register_globals=Off 으로 설정한 상태에서는 GET이나 POST로 값을 보낼 때 어떻게 하느냐?
별로 어렵지 않습니다.
변수를 받을때(받을 변수가 $foo)라면 그냥 $foo로 받지 말고 $foo = $_GET["foo"] 이렇게 받는 식으로 합니다.
하거나 또는 보안상 register_globals 를 OFF 로 변경하고 싶은데 기존의 소
스들 때문에 망설이시는 분들께 유용한 함수가 될것 같네요.
테스트 환경은 다음과 같이 하시면 이해가 쉬울 것 같습니다. 일단 php.ini
에서 register_globals = Off 로 설정을 한뒤에 아파치를 재시작 합니다. 다
음 간단하게 웹루트에 test_query.php 라는 스크립트를 하나 만듭니다.
--------- cut here test_query.php -----------
<?
function parse_query_str($level=0) {
# php.ini 의 register_globals 값을 확인한다.
# register_globals = OFF 일 경우만 작동.
if(ini_get("register_globals")) return;
# php 버젼이 4.1 보다 낮을 경우에는 함수 안에서 trackvar
# 를 사용하기 위해 global 로 지정해 줘야 한다.
if(substr(PHP_VERSION,0,3) < 4.1) {
global $HTTP_GET_VAR, $HTTP_POST_VARS;
$O_GET = $HTTP_GET_VARS;
$O_ENV = $HTTP_ENV_VARS;
$O_POST = $HTTP_POST_VARS;
if($level) {
global $HTTP_COOKIE_VARS,$HTTP_SESSION_VARS,$HTTP_SERVER_VARS;
$O_SERVER = $HTTP_SERVER_VARS;
$O_COOKIE = $HTTP_COOKIE_VARS;
$O_SESSION = $HTTP_SESSION_VARS;
}
} else {
$O_GET = $_GET;
$O_ENV = $_ENV;
$O_POST = $_POST;
if($level) {
$O_SERVER = $_SERVER;
$O_COOKIE = $_COOKIE;
$O_SESSION = $_SESSION;
}
}
# 4.1 부터는 trackvars 에 대해 무조건 배열로 생성을 하기
# 때문에 is_array() 함수 보다는 count() 함수로 배열의 수를
# 체크한다.
if(count($O_GET)) {
foreach($O_GET as $key => $value) {
global ${$key};
${$key} = $value;
}
}
if(count($O_POST)) {
foreach($O_POST as $key => $value) {
global ${$key};
${$key} = $value;
}
}
if( $level && count($O_COOKIE) ) {
foreach($O_COOKIE as $key => $value) {
global ${$key};
${$key} = $value;
}
}
if( $level && count($O_SESSION) ) {
foreach($O_SESSION as $key => $value) {
global ${$key};
${$key} = $value;
}
}
if( $level && count($O_SERVER) ) {
foreach($O_SERVER as $key => $value) {
global ${$key};
${$key} = $value;
}
}
}
# POST, GET 만 제어한다.
parse_query_str();
echo "$a<br>\n$b<br>\n$c<br>\n";
# POST, GET , COOKIE, SESSION, SERVER_var 를 모두 제어한다.
parse_query_str(1);
echo "$PHP_SELF\n";
?>
--------- cut here test_query.php -----------
다음 http://domain.com/test_query.php 를 웹브라우져로 호출을 합니다. 결
과는 소스의 parse_query_str() 함수를 호출을 할 때와 안할 때의 차이를 보
시면 알겁니다.
위와 같이 이용을 하면 register_globals 의 값을 On 으로 두던 Off 로 두던
보안을 강화하면서 register_globals 의 값에 상관없이 register_globals 의
값이 On 일때 처럼 코딩을 할 수 있게 됩니다.
이 함수가 보안을 위하여 register_globals 의 값을 Off 로 두는것에 어떠한
작용을 하게 될지에 대해서는 검증이 되지는 않았습니다만 일단 넘어오는 값
을 GET 이면 GET 으로 넘어온 값을 조절하고 POST 이면 POST 의 값을 조절하
기 때문에 크게 위배되지는 않을것 같습니다.
원래는 GET 과 POST 로 넘어오는 값을 하나의 배열로 return 하는 방법이 더
낳을것 같지만 그렇게 되면 기존의 소스를 너무 수정을 해야 하기 때문에 위
와 같은 식으로 전역 변수화 처리를 한 것입니다. ^^;
- http://www.oops.org 에서 가져왔습니다 -
php.ini에서 절대로 register_globals=On 으로 하면 안됩니다.
이는 보안에 심각하게 위배되며, register_globals=On으로 설정된 상태의 php는 더 이상 스크립트 언어로써의 가치가 없다고까지 이야기하는 사람도 있습니다.
그럼 register_globals=Off 으로 설정한 상태에서는 GET이나 POST로 값을 보낼 때 어떻게 하느냐?
별로 어렵지 않습니다.
변수를 받을때(받을 변수가 $foo)라면 그냥 $foo로 받지 말고 $foo = $_GET["foo"] 이렇게 받는 식으로 합니다.
'스크립트 > Php 코드 팁' 카테고리의 다른 글
php 소수점 아래 버리기 (0) | 2009.05.24 |
---|---|
mysql 999999만 빼고 숫자로 나열하기 (0) | 2009.05.24 |
$REMOTE_ADDR 이 안먹히세요? (0) | 2009.05.09 |
도메인 이름 뽑아내기 (0) | 2009.05.01 |
php 로 오늘 표현하기 (0) | 2009.04.30 |