iWiz ShareBase

IT Specialist 윤태현의 iWiz ShareBase는 IT뿐 아니라 각종 잡다한 지식들을 함께 나누는 지식공유 커뮤니티입니다.

iWiz,ShareBase,윤태현,Java,JSP,EJB,IT,정보기술,웹프로그래밍,PHP,ASP,DBMS,MySQL,서버,네트워크,server,network,WAS,웹애플리케이션,블로그,blog,웹서버,DB,오라클,oracle,mysql,JRun,웹로직,톰캣,tomcat,아파치,자동차,EF쏘나타,로또 6/45

갤러리 Pixelgrapher.com | 로또 6/45 번호생성 및 통계 데이터 | 전체기사보기 | 전체글 #1 | 전체글 #2 | 전체글 #3 | 전체글 #4 | 전체글 #5 | 전체글 #6 | 전체글 #7 | 전체글 #8 | 전체글 #9 | 전체글 #10 |
HOME iWiz
ShareBase
Remember 0523 & 0818
지식은 나눌수록 커집니다 - iWiz's ShareBase
웹프로그래밍(기타) PHP, ASP, Perl, CGI 등 각종 웹프로그래밍에 관한 자료들입니다.


  iWiz(2004-01-04 22:51:31, Hit : 7577, Vote : 32
 http://www.wz.pe.kr

PHP magic_quote_gpc 옵션 관련 문제점


PHP4에서의 magic_quotes_gpc 문제

magic_quotes_gpc 이슈와 관련된 항목
- php.ini : magic_quotes_gpc, magic_quotes_runtime, magic_quotes_sybase
- php functions : addslashes, stripslashes


1. 개요

magic_quotes_gpc는 PHP4에서부터 기본적으로 on으로 설정되는 옵션이다.  이 옵션의 역할은 GPC(Get, Post, Cookie)를 통해 넘어오는 문자열중에서 ' (single-quote)와 " (double quote), (backslash), NUL값의 앞에 자동으로 백슬래시() 문자를 붙여주는 기능이다.
(magic_quotes_runtime은 DB와 텍스트파일에서 읽어 들이는 모든 데이터에 똑같은 작업을 하게되며, magic_quotes_sybase 옵션이 켜져있으면 ' (single-quote) 문자 앞에 똑같이 ' (single-quote)를 하나 더 붙이게 된다.)

이 기능은 PHP에서 DB작업을 용이하게 하기 위해서 제공하는 기능으로서, GPC(Get, Post, Cookie)를 통해 넘어오는 데이터에 대해 아무 처리도 하지 않고 바로 DB로 Query문을 보낼 수 있도록 하는 기능이다.  만약 이 기능이 없고 프로그램상에서도 넘어온 데이터에 대해 어떠한 처리도 하지 않는다면 ‘98이라는 단어로 검색을 한다면 select * from test where title like ‘’98’ 이라는 쿼리문이 만들어져 DB에러가 나게된다.  그러나 magic_quotes_gpc가 켜져있다면 쿼리문은 한다면 select * from test where title like ‘’98’이 되고, ’는 MySQL에 의해 다시 ‘ 문자로 변환되므로 쿼리문은 아무 문제가 없게 된다.

예전에는 PHP+MySQL 연동시 GPC를 통해 넘어온 데이터를 쿼리문에 넣기전에 addslashes함수를 이용해 ' (single-quote) 문자 등에 를 붙여주었으나, PHP4에서는 magic_quotes_gpc를 켜놓으면 이 과정이 자동처리 되므로 매우 편리한 프로그래밍이 가능하게 된다.


2. magic_quotes_gpc의 문제점

프로그램 로직상의 문제

magic_quotes_gpc는 편리한 기능이기는 하나 사용자가 입력한 데이터를 임의적으로 조작해 넘겨준다는 점에서 근본적으로 문제를 안고 있다.  다음과 같은 예를 보자.
if ($year == ”’98”) { .... }
여기에서 $year는 GET을 통해 넘어온 변수라고 가정을 하고, 만약 입력값이 ’98 이라면 어떤 루틴을 실행하게 된다.  그러나 magic_quotes_gpc가 켜져있다면 사용자가 입력한 값이 ‘98이라고 하더라도 실제 $year 변수에 할당되는 값은 ’98이 된다.  따라서 위의 비교문은 false라는 결과가 나오게 되고, 이에 따라 예상치못한 결과가 나올 수도 있다.  비록 흔치 않은 경우이긴 하지만 magic_quotes_gpc로 인해 문제가 일어날 소지는 충분하다.

이전 개발 프로그램과의 문제

그러나 더 큰 문제는 이전에 짜여진 프로그램이다.  예전에는 PHP에서 이 기능이 자동으로 on되어 있지 않기 때문에 많은 개발자들이 이런 옵션의 존재를 알지못하거나 또는 무시하였다.  따라서 GPC를 통해 넘어온 데이터를 쿼리문에 넣을 때는 사전에 addslashes 함수를 이용해 ‘ 나 “ 문자 앞에 역슬래쉬를 붙여주었다.  만약 이런 방식으로 짜여진 프로그램을 magic_quotes_gpc 옵션이 활성화 되어있는 PHP 상에서 실행할 경우 어떠한 일이 발생하겠는가?  다음의 예를 보자
① 사용자가 Form에서 year라는 필드에 ‘98을 입력후 submit
② magic_quotes_gpc에 의해 자동으로 가 붙어 ’98이 $year 변수에 할당됨.
③ addslashes 함수에 의해 ’98이 \’98로 변환됨.
④ 쿼리문에 $year를 포함시키면 MySQL에서 escape처리되어 실제 DB에서 인식되는 값은 최종적으로 ’98이 됨.

사용자가 실제로 입력한 값은 ‘98이지만 결과적으로 DB에서 인식되는 값은 ’98이 된다.  따라서 이 변수가 select 쿼리에서 검색을 위해 사용된다면 원치않는 검색 결과가 나오게 될 것이고, insert 쿼리에 의해 DB에 저장된다면 데이터에 대한 무결성이 깨지게 되는 결과를 초래한다.

오라클 등 타 데이터베이스와의 문제

  MySQL에서는 ‘ 등의 문자에 대한 처리를 앞에 를 붙여주면 되는데 반해, 오라클이나 MS SQL, SyBase 등 많은 데이터베이스에서는 앞에 ' (single-quote)를 하나 더 붙이는 것으로 처리하게 된다.  만약 오라클DB 등을 이용하는데 magic_quotes_gpc가 켜져있다면 어떤 일이 발생하게 될 것인가?  magic_quotes_gpc가 켜져있다면 ' (single-quote)와 " (double quote), (backslash) 문자앞에는 자동으로 가 붙게되고, 오라클에서는 는 escape문자로 처리되지 않고, 단지 하나의 일반 문자로만 인식하게 되므로 데이터의 무결성에 심각한 문제를 일으키게 된다.  만약 사용자가 폼에서 [’98 “수출실적”] 이라는 문자열을 입력한다면 DB에는 [’98 ”수출실적”] 이라고 저장이 되는 것이다.  물론 검색 등을 위한 Select 쿼리 등에서도 동일한 문제점이 발생하게 된다.


3. 문제 해결 방법

이 문제에 대한 임시적인 해결책으로는 데이터베이스에서 데이터를 가져와 화면에 뿌려줄때는 미리 stripslashes 함수를 이용해 로 시작하는 escape 문자를 벗겨주는 방법이 있다.  ’98에 stripslashes 함수를 적용하면 ‘98로 변환되기 때문이다.  그러나 이 방법 역시 커다란 문제점을 가지고 있는데 만약 DB에 c:windowstemp라는 문자열이 있다면 stripslashes 후에는 문자가 모두 벗겨져 c:windowstemp로 바뀌고 만다.  이것은 전혀 의도했던 결과가 아니다.

또한 이런 문제를 떠나서도 이미 ‘ 기호 등에 가 붙어서 DB에 저장된 상태이기 때문에 데이터의 무결성이 깨진 상태이기 때문에 그 자체로도 문제가 된다.  해당 데이터베이스를 PHP뿐 아니라 Java, C, Perl 등 다양한 언어에서 사용할 수 있는데, 데이터베이스에서 데이터를 불러오거나 검색 Query를 실행할 때마다 stripslashes 또는 addslashes에 해당하는 처리를 해줘야 하기 때문이다.  (즉 데이터베이스에서 값을 가져왔을 때에는 를 벗겨줘야 하고, where 절 등에 사용할 때는 를 붙여줘야 한다.  데이터베이스에 저장된 값은 ‘98이 아니라 ’98이기 때문이다)

근본적인 해결 방법

근본적인 해결책은 php.ini에서 magic_quotes_gpc옵션을 off시켜두고 아예 사용하지 않는 것이 가장 좋은 방법이다.  이 경우 사용자의 입력데이터는 어떠한 변형없이 GPC를 통해 넘어와 PHP 변수로 할당되게 된다.  이 데이터는 다음과 같은 전처리 작업을 거친 후 실제 작업에 사용하면 된다. ($test는 test라는 폼필드에 의해 자동으로 할당된 변수라고 가정)

- MySQL : $test = addslashes($test);
- Oracle : $test = str_replace(“’”, “’’”, $test);  (MS SQL, Sybase 등도 동일)
- 기타처리 : 텍스트파일 저장이나 메일발송 등의 처리시에는 어떤 처리도 필요치 않다.

만약 magic_quotes_gpc 옵션의 on/off 여부와 관계없이 사용자가 입력한 데이터를 그대로 받고 싶다면(즉 magic_quotes_gpc가 off된 상태와 동일한 데이터), 번거롭지만 다음과 같은 함수를 만들어 전처리 과정을 거쳐줘야 한다.

function iwantcleandata ($gpcstr) {
    if ( get_magic_quotes_gpc() == 1 ) $gpcstr = stripslashes($gpcstr);
    return $gpcstr;
}
...
$test = iwantcleandata($gpcstr);
...

기존 프로그램의 처리

앞으로 새로 개발될 프로그램은 magic_quotes_gpc가 꺼져있다는 전제하에서 코딩하거나 또는 앞에서 예로든 iwantcleandata 같은 함수를 이용한 전처리로 magic_quotes_gpc의 on/off 여부와 관계없이 코딩을 하면 될 것이다.  그러나 가장 큰 문제가 되는 부분들은 역시 기존에 PHP로 개발된 프로그램들이라고 할 수 있다.  기존 프로그램들이 magic_quotes_gpc가 꺼져있는 환경에서도 잘 동작하기 위해서는 다음과 같은 부분을 확인해 봐야 한다.

① 데이터베이스 저장시 (혹은 query문의 where절 생성시)
입력데이터를 사용하는 용도에 따라 달라진다.  MySQL DB에 사용할 경우에는 SQL 구문 작성전에 addslashes 함수를 사용하는지의 여부를 확인해야 한다.  Oracle DB에 사용할 경우에는 str_replace 함수 또는 유사한 함수를 이용해 ‘를 ‘’으로 적절히 변환해주는지 체크해봐야 한다.  또한 텍스트 파일 저장이나 메일 발송 등의 다른 용도로 사용할 경우에는 전처리 과정을 거치지 않고, 입력된 데이터 그대로 사용해야 하므로 이를 확인해 본다.

② 데이터베이스 로드시 (저장된 데이터를 화면에 뿌려주는 루틴)
magic_quotes_gpc가 off된 상태에서 ①에서 처럼 데이터를 DB에 저장하면 사용자가 입력한 그대로 DB에 저장되므로, 별도의 과정을 거칠 필요없다.  따라서 혹시 stripslashes 함수로 불필요하게 문자를 제거하는 루틴이 없는지 확인해 봐야 한다.  DB데이터에 포함되어 있는 문자는 c:windows 처럼 사용자가 직접 입력한 문자이므로 stripslashes 함수로 벗겨내면 안되기 때문이다.  단, 이 문서의 앞부분에 언급했던대로 magic_quotes_gpc가 on으로 되어 있는 상태에서 addslashes 함수를 중복사용해 MySQL에 데이터를 저장했다거나, addslashes를 해주지 않았더라도 오라클 데이터베이스에 저장했을 경우에는 사용자 입력값에 불필요하게 가 붙어서 저장되어 있다.  이 부분은 문제의 소지가 있는 테이블을 검색해 데이터를 수정해 주거나, 향후 문제 발생시 상황에 맞게 적절하게 대처하면 된다.



62   mod_throttle 모듈을 이용한 사용자 트래픽 제어  iWiz 2006/06/22 8847 0
61   Tomcat-Apache using JK2 connector  iWiz 2004/03/21 6088 41
60   RedHat 9.0에서의 JRun JSP 컴파일러의 문제점  iWiz 2004/01/04 5329 50
59   RedHat 9.0에서의 JRun-Apache 커넥터의 문제점  iWiz 2004/01/04 5018 48
58   JRun 4.0의 튜닝 관련 옵션  iWiz 2004/01/04 5758 68
57   JRun 4.0의 Activity 모니터링 방법  iWiz 2004/01/04 4735 57
56   JRun4.0: DataSource 커넥션풀 관련 옵션 [4]  iWiz 2004/01/04 6486 46
55   JRun에서 JSP 컴파일시 java 파일 생성하기  iWiz 2004/01/04 7731 63
54   JRun의 실제 서비스 운영시 고려사항  iWiz 2004/01/04 6125 44
53   수정된 인터넷 익스플로러에서 상호작용 ActiveX 컨트롤 활성화 가이드  iWiz 2006/03/03 8139 4
52   HTML 특수기호 엔터티(Entity) 테이블 [2]  iWiz 2006/03/03 13812 2
51   웹사이트의 새로운 혁명 Ajax [13]  iWiz 2005/11/22 5662 6
50   MSN 메신저 친구 자동등록 스크립트  iWiz 2004/10/12 6028 35
49   JavaScript MD5 해쉬 생성 함수  iWiz 2004/01/07 8816 35
48   JavaScript로 만든 진법변환 및 보수계산기 [4]  iWiz 2004/01/04 156125 51

1 [2][3][4][5]
 

Copyright 1999-2023 Zeroboard / skin by zero
iWiz ShareBase, ⓒCopyleft by iWiz.  For more information contact .
본 웹사이트에 게시된 이메일 주소가 전자우편 수집 프로그램이나 그 밖의 기술적 장치를 이용하여 무단으로 수집되는 것을 거부하며, 이를 위반시에는 정보통신망법에 의해 형사처벌됨을 유념하시기 바랍니다. [게시일 2004. 1. 31]