1

주제: 태터내부에 대해 궁금한것이 있어서요.. :)

웹개발공부를 하고있는 초보인데 태터툴즈소스를 보며 공부를 하고있습니다. 소스코드를 보며 공부를 하는데 잘모를만한것이 있어서요
개발관련 질문코너(?)가 없는듯하여 이곳에 올려봅니다.

태터툴즈를 보면 _GET 이나 _POST등의 데이터를 소스코드초반(?)에 IV 에 미리지정해놓고 이곳에 지정하지않은 값은 없애거나 _GET = array() 처럼 아예 초기화 해버리던데.. 그이유를 알수있을까요?

2

답글: 태터내부에 대해 궁금한것이 있어서요.. :)

input validation을 통해서 php 특정 버전에서 발생할 수 있는 exploit을 방지함과 동시에 그렇게 소스가 작성될 가능성을 봉쇄합니다.  보안홀을 막는 과정으로 생각하시면 될 듯. smile

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

3

답글: 태터내부에 대해 궁금한것이 있어서요.. :)

php의 특성중 하나라면 변수의 타입이 모호한 Loosely Type-binding 형태를 사용한다는 것입니다. "1"과 true와 1을 정확히 구분하기 어려울 때가 많습니다. 더구나 정수형 변수가 올것이라고 생각하였으나 스트링이 오고 이것이 자동 타입 변화에 따라 처리되므로 정수형일때와 동일하게 흐름을 가질 수 있습니다.

어떻게 보면 작성할때는 편하지만 잘못된 인풋임에도 스무스하게 체크루틴들을 피해갈 수 있는 것이죠. 방법으로는 타이트하게 값을 검사할 수도 있지만 이미 작성된 코드의 양도 많고 해서 트릭을 사용한 것입니다.

보안적인 검사를 위하여 크게 두가지 방식을 사용합니다. 첫번째는 위에서 나온 IV입니다. Input Validation을 제공함으로써 일종의 Strict Type-Binding으로 유도를 하는 것이죠. 페이지 작성자가 들어오는 값에 대한 타입 예상을 기술하면 그 타입이 아닌 인풋은 모두 제거됩니다. 한가지 맹점은 해당 IV 기술에 있어서 대충대충 해 버리면 여전히 기존의 보안정도와 큰 차이가 없습니다. 그래서 좀더 명확히 적어야 하고 개발자 디펜던시가 좀 있는 편입니다.

다른 접근은, 일부 중요하다고 생각되는 작업을 하는 함수들은 자체적으로 타입체크를 한번 더 하도록 되어 있습니다. 해커의 공격 뿐만이 아니라 내부의 버그로 인해 사용자의 데이터가 심각하게 훼손되는 것을 최대한 막기 위한 접근이죠. 디비 쿼리를 사용하는 오퍼레이션의 경우 가능하면 말단에서 쿼리를 직접 작성하지 말고 lib이나 콤포넌트로 집중시키고 자동으로 escaping을 수행하는 안전한 함수를 이용하도록 유도하는 것도 내부의 버그에 대한 영향을 최소화 하기 위함입니다.

태터 코드의 경우 소스가 공개되어 있고 설치되는 환경이 다양하거나, 또 많은 개발자들이 소스를 커밋한다는 특성에 PHP의 장점이자 단점인 부분들을 보안하고자 저런 트릭들을 사용중입니다.