세이박스

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 registart 값 off 후 파일 업로드

웹프로그램

@extract($HTTP_SESSION_VARS);
@extract($HTTP_COOKIE_VARS);
@extract($HTTP_SERVER_VARS);
@extract($HTTP_GET_VARS);
@extract($HTTP_POST_VARS);
@extract($HTTP_ENV_VARS);

if($_FILES['file']['name']){
$AllowExt='/\.alz|\.txt|\.psd|\.xls|\.gz|\.zip|\.bmp|\.doc|\.exe|\.dat|\.gif|\.htm?|\.hwp|\.pdf|\.ppt|\.rar|\.jp?g|\.tif|\.png/i';
$rename=date("YmdHis");

$saveDir="$DOCUMENT_ROOT/report_files/".date("Ym")."/";

if(!is_dir($saveDir)) {
$oldumask = umask(0);
mkdir($saveDir, 0777); // or even 01777 so you get the sticky bit set
umask($oldumask);

//mkdir($saveDir, 0777);
}

if(!preg_match($AllowExt, $_FILES['file']['name'],$ext)) //확장자 비교
AlertBack('업로드 금지 파일입니다.');

$filename=$saveDir.$rename.$ext[0];

if(!move_uploaded_file($_FILES['file']['tmp_name'],$filename))
AlertBack('파일 업로드를 실패했습니다.');


$filerename="http://".$SERVER_ADDR ."/report_files/".date("Ym")."/".basename($filename);
}

PHP registart 값 off 후 세션 에러

웹프로그램
php 4.3.4에서 session_start()를 써도 저런 메세지가 나지 않던데요. 물론 에러리포팅은 다 켜 놓았구요.
session_register 대신에 $_SESSION['이름'] ="값"; 을 써 보세요. 아마 이것 때문엔거 같은데, 자세한건 저도 잘 모르겠습니다.


Warning: Unknown(): Your script-x possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0
에 대한 문제 해결~

===========================================================

PHP에서 세션다루는 방법이 변경되었기 때문입니다. (4.2)

session_register()
session_unregister()
session_registered()
함수들의 사용이 권장되지 않습니다.

register_globals 가 On 이나 Off 이냐에 관계없이 세션에는 $_SESSION[] 전역변수의 사용이 권장됩니다. (권장사항)

세션 생성하기
$_SESSION['userid'] = "admin";

참고주소
http://kr2.php.net/manual/en/function.session-register.php

PHP register_global=Off 상태 라도 변수 먹히게

웹프로그램
PHP 소스 상단에 다음과 같이 선언해주면 php.ini에 register_global = OFF 상태여도 POST전송시 변수값이 전송 됩니다.
웹소스를 코딩시 서버 설정을 손대지 못할 경우 유용하게 사용하실 수 있을겁니다.

@error_reporting(E_ALL ^ E_NOTICE);
@extract($HTTP_GET_VARS);
@extract($HTTP_POST_VARS);
@extract($HTTP_SERVER_VARS);
@extract($HTTP_ENV_VARS);
@extract($HTTP_SESSION_VARS);
@extract($_FILES);