세이박스

PHP register_globals=Off 상태에서의 POST,GET 변수제어

웹프로그램
제목: register_globals=Off 상태에서의 POST,GET 변수제어
분류: php
글쓴이: 김정균 <admin@oops.org>

호스팅 서버 같은 곳에서 보안상의 이유로 register_globals
를 OFF 로 변경 하거나 또는 보안상 register_globals 를 OFF
로 변경하고 싶은데 기존의 소스들 때문에 망설이시는 분들께
유용한 함수가 될것 같네요.

JSBoard 를 개발하다가 보안때문에 register_globals 를 OFF
로 두었을때 작동을 하지 않는다는 문의가 많이 들어와 만든
함수입니다..

* PHP 4.1 이상 버젼용

function parse_query_str() {
foreach($_GET as $key => $value) {
global ${$key};
${$key} = $value;
}

foreach($_POST as $key => $value) {
global ${$key};
${$key} = $value;
}
}

* PHP 4.0 이하 버젼용

function parse_query_str() {
foreach($HTTP_GET_VARS as $key => $value) {
global ${$key};
${$key} = $value;
}

foreach($HTTP_POST_VARS as $key => $value) {
global ${$key};
${$key} = $value;
}
}

테스트 환경은 다음과 같이 하시면 이해가 쉬울 것 같습니다.
일단 php.ini 에서 register_globals = Off 로 설정을 한뒤에
아파치를 재시작 합니다. 다음 간단하게 웹루트에 test_query.php
라는 스크립트를 하나 만듭니다.

--------- cut here test_query.php -----------
<?
function parse_query_str() {
foreach($_POST as $key => $value) {
global ${$key};
${$key} = $value;
}

foreach($_GET as $key => $value) {
global ${$key};
${$key} = $value;
}
}
parse_query_str();
echo "$a<br>\n$b<br>\n$c<br>\n";
?>
--------- cut here test_query.php -----------

다음 http://domain.com/test_query.php 를 웹브라우져로 호 출을 합니다. 결과는 소스의 arse_query_str() 함수를 호출 을 할 때와 안할 때의 차이를 보시면 알겁니다.

위와 같이 이용을 하면 register_globals 의 값을 On 으로 두던 Off 로 두던 보안을 강화하면서 register_globals 의 값에 상관없이 register_globals 의 값이 On 일때 처럼 코 딩을 할 수 있게 됩니다.

이 함수가 보안을 위하여 register_globals 의 값을 Off 로 두는것에 어떠한 작용을 하게 될지에 대해서는 검증이 되지 는 않았습니다만 일단 넘어오는 값을 GET 이면 GET 으로 넘 어온 값을 조절하고 POST 이면 POST 의 값을 조절하기 때문 에 크게 위배되지는 않을것 같습니다.

원래는 GET 과 POST 로 넘어오는 값을 하나의 배열로 return 하는 방법이 더 낳을것 같지만 그렇게 되면 기존의 소스를 너무 수정을 해야 하기 때문에 위와 같은 식으로 전역 변수화 처리를 한 것입니다. ^^;
---------------------------------------------------------------------------
http://kltp.kldp.org/

PHP register_global=off 일 때 post 값 전송

웹프로그램

$_GET['a'] --> GET으로 넘어온 $a라는 변수..
$_POST['a'] --> POST로 넘어온 $a라는 변수..
$_SERVER['a'] --> ??
$_COOKIE['a'] --> 쿠기 변수 $a ??
$_ENV['a'] --> ??
$_REQUEST['a'] --> ??
$_FILE['a']['name']; --> $a라는 폼으로 올라온 첨부파일의 파일명
$_FILE['a']['size']; --> $a라는 폼으로 올라온 첨부파일의 크기
$_SESSION['a']; --> 세션변수 $a
$HTTP_GET_VARS['a']; --> $_GET['a']과 동일? 전혀 차이 없음?
$HTTP_POST_VARS['a']; --> $_POST['a']과 동일? 전혀 차이 없음?

@extract($HTTP_GET_VARS);
@extract($HTTP_POST_VARS);
@extract($HTTP_SERVER_VARS);
@extract($HTTP_ENV_VARS);
--> 모든 변수들을 처리함? register_globals = On 같은 조건?

응용 예)
if($_GET)extract($_GET);
if($_POST)extract($_POST);
if($_COOKIE)extract($_COOKIE);
if($_SERVER)extract($_SERVER);
if($_ENV)extract($_ENV);
$PHP_SELF=$_SERVER[PHP_SELF];
$HTTP_REFERER=$_SERVER[HTTP_REFERER];
$REMOTE_ADDR=$_SERVER[REMOTE_ADDR];

PHP POST 전송된 첨부파일 확장자 확인 하기

웹프로그램

$s_ext=substr($s_name,strrpos($s_name,".")+1);

PHP 설치 후 POST 값이 전송되지 않을경우

웹프로그램

php.ini 파일에서 보안 문제로 잠겨있는
register_globals = On 이거 on으로 해주세요~~

DOCUMENT_ROOT값 프린팅 안될때두~~~

입력폼에서 파일 올리기

웹프로그램
<form name="form" method="post" action="url" ENCTYPE="multipart/form-data">
<input type="file" name="img">
</form>

첨부파일 전송시 반드시 폼 테그에
ENCTYPE="multipart/form-data"
포함되어야 함 이걸 실수로 빠트려서 고생하는 경우가 다소 있음 ^^