Daniel's Knowledge Storage

넘겨 받은 값 일단 오염됐다고 보라 - PHP 보안 본문

Develop/PHP

넘겨 받은 값 일단 오염됐다고 보라 - PHP 보안

다니엘SEO 2009. 6. 15. 02:33

PHP 보안

크리스 쉬플릿 | 한동훈 옮김

한빛미디어 2006.03.04



크리스 쉬플릿(Chris Shiflett) 저,「PHP 보안(Essential PHP Security」에서 저자는 이 책에서

가장 먼저, 넘겨받은 값(POST, GET, REQUEST)의 정화(淨化)에 대해 몇 번이고 강조한다.

해킹의 대부분은 바로 이 값을 넘어온 그대로 사용하는 실수로 인해 벌어진다고 한다.

심지어 저자는 (MySql) DB에 입력된 데이터 마저도 신뢰해서는 안 된다고 한다.

 

아무튼, 악의적인 사용자가 아니라 하더라도 넘어온 값을 그대로 사용한다면

예기치 않은 오류들이 발생할 수도 있다.

 

따라서, 코드의 상단에 간단히 아래와 같이 넘어온 값은 정화작업을 거치는 것이 좋다.

이를테면,

$clean_text = htmlspecialchars ( $_POST['text'] );

이렇게 말이다.

 

하지만 넘어오는 모든 값을 일일히 이렇게 하나씩 변수에 담는다는 것은 비효율적일 수 있다.

통상적으로는 이렇게 할 수 있다.

 

foreach ( $_POST as $key => $value ) { $clean_post[$key] = htmlspecialchars ( $value ); }

 

하지만 만일, POST, GET, REQUEST 값 모두를 정화하려면 또 코드가 반복되고 만다.

아래와 같이 말이다.

 

foreach ( $_GET as $key => $value ) { $clean_get[$key] = htmlspecialchars ( $value ); }

foreach ( $_POST as $key => $value ) { $clean_post[$key] = htmlspecialchars ( $value ); }

foreach ( $_request as $key => $value ) { $clean_request[$key] = htmlspecialchars ( $value ); }

 

이 코드를 더 줄이기 위해서, PHP 함수 array_map을 활용한다. (☞ PHP.net의 array_map 함수 설명 바로가기)

 

function _cleaning ( $v ) { return ( htmlspecialchars ( trim ( $v ) ) ); }
$cleanGet = array_map ( '_cleaning', $_GET );
$cleanPost = array_map ( '_cleaning', $_POST );
$cleanRequest = array_map ( '_cleaning', $_REQUEST );

(위 코드에서는 htmlspecialchars 함수 외에 trim 함수를 더 넣었다.

 

위와 같이 사전작업을 한 후에 $cleanX 변수를 사용하면

더욱 안전한 프로그래밍이 되지 않을까?

Comments