PHP의 경우 변수가 정말 개방적이다. 때론 개방적이다 못해 해커로 부터 공격당하기 좋은 환경또한 제공해 준다.
과거 프로그램들을 보면 GET, POST 를 변수화 시켜서 사용하거나 php.ini 에서 변수화 설정을 통해 사용하기도 했었다. 이러한 방법은 편리하긴 하나 보안의 취약점이기도 하다.
현재와서는 함수 또는 클래스화 하여 처리하고 있지만 PHP만 주력으로 해왔던 개발자의 경우 상당히 귀찮게만 느껴진다.
만약 아래와같은 방식으로 GET, POST에 대한 변수화 처리를 한다면 반드시 보안이 필요하다.
extract($_GET); extract($_POST);
만약 아래와 같은 변수가 넘어왔다고 가정해보자
<input type="hidden" name="_COOKIE[ID]" value="admin" />
<input type="hidden" name="_SESSION[ID]" value="admin" />
<input type="hidden" name="_SERVER[REMOTE_ADDR]" value="0.0.0.0" />
저 상황이라면 대부분 오류가 발생할것이다. 그이유중 하나가 extract 함수 자체가 기존 변수를 초기화 하기때문이다. 또한 $_SERVER 로 처리되는 프로세서는 상당히 많은 부분중 하나로 초기화 시 여러 시스템에 문제가 발생된다.
이와 별도로 아래와 같이 처리한다면 더 위험할 수 있다.
foreach($_GET as $k=>$v){ $kk=$v; }
위와 같이 처리된다면 저장 IP의 경우 알 수 없을 것이다.
결론은 위와 같은 방법을 사용한다면 아래와 같은 소스코드를 공통 실행 파일에 추가해 주는게 보안에 좋다.
$denyPostGet = array('_SESSION','_SERVER','COOKIE','_FILES');
foreach($denyPostGet as $key){ unset($_GET[$key],$_POST[$key]);}
끝.