4.5. 웹 기반 애플리케이션 입력 (특히 CGI 스크립트)

CGI 스크립트와 같은 웹 기반 애플리케이션은 다소의 신뢰된 서버에서 실행되고 웹을 통해 어떻게든 입력 데이타를 얻어야 한다. 입력 데이타는 일반적으로 신뢰할 수 없는 사용자로부터 오기 때문에 이 입력 데이타의 정당성은 입증되어야 하는데 실은 이 정보가 실제 신뢰할 수 없는 제 삼자로부터 올 수도 있다; 더욱 자세한 정보는 6.13절 을 보라. 예를 들어, CGI 스크립트는 일련의 표준 환경 변수들과 표준 입력을 통해 이 정보를 넘겨받는다. 이 텍스트의 나머지는 CGI 스크립트가 동적 웹 컨텐트를 구현하는 가장 공통된 기술이기 때문에 이를 구체적으로 논의할 것이다. 물론 일반적인 핵심은 대부분의 다른 동적 웹 컨텐트 기법에 동일하게 적용된다

많은 CGI 스크립트의 입력은 소위 ``URL-encoded" 포맷으로 제공되기 때문에, 즉 어떤 값이 %HH 포맷 (HH 는 그 바이트에 대한 십육진수 코드) 으로 쓰여 있기때문에 한가지 추가적인 복잡성을 더한다. 각자 또는 CGI 라이브러리는 입력을 URL-decoding 한 후 그 바이트 값이 받아들일 수 있는지 검사함으로써 이러한 입력을 정확히 다뤄야 한다. %00 (NIL) 과 %0A (개행) 과 같은 문제가 있는 값을 포함한 모든 값을 정확히 다뤄야 한다. 입력을 한 번 이상 디코드하지 마라. 그렇지 않으면 %2500 같은 입력은 이상하게 다뤄질 것이다 (``%25" 는 ``%" 로 전환되며 그 결과 생긴 ``%00" 은 틀리게 NIL 문자로 전환될 것이다).

CGI 스크립트는 일반적으로 입력에 특별 문자를 포함함으로써 공격받는데 위의 설명을 보라.

웹 기반 애플리케이션에 사용할 수 있는 다른 데이타 형태는 ``쿠키"이다. 사용자는 임의의 쿠키 값을 제공할 수 있으며 따라서 특별한 사전 조치를 취하지 않는다면 신뢰될 리 없다. 또한 쿠키는 사용자 추적에 사용할 수 있는데 이는 많은 사용자들에 대해 사생활 침해 문제를 야기할 수 있다. 그 결과 많은 사용자는 쿠키를 금지하고 있으며 따라서 가능하다면 웹 애플리케이션은 쿠키 사용이 필요치 않도록 설계되어야 한다 (그러나 각 사용자들을 인증해야 할때에 대한 저자의 논의를 보라). 저자는 현재 세션이 종료된 후에도 남아있는 영속적인 쿠키 사용을 피하거나 제한하도록 권한다. 정말로 미국의 에이전시들은 특별한 환경을 제외하고는 사생활 침해에 대한 우려때문에 영속적인 쿠키 사용이 금지되어 있다; OMB guidance in memorandum M-00-13 (June 22, 2000) 를 보라. 쿠키를 사용할 때 몇몇 브라우저는 당신은 사생활 프로파일 (서버의 루트 디렉토리내에 p3p.xml 이라는) 을 갖고 있다고 주장할 수 있음에 주의해라.

몇몇 HTML 폼은 어떤 비합법적인 값을 예방하기 위해 클라이언트 측에서의 입력 검사를 포함하고 있으며 이는 일반적으로 자바스크립트/ECMA 스크립트 또는 자바를 사용하여 구현된다. 이 검사는 어떠한 네트워크 접근도 요하지 않으면서 ``즉각적"으로 할 수 있기 때문에 사용자에게 유용할 수 있다. 그러나 이 종류의 입력 검사는 공격자가 검사를 받지 않고도 웹 서버에 직접적으로 비합법적인 값을 보낼 수 있기때문에 보안에 대해서는 무용지물이다. 이를 막는 것이 어려지는 않지만 임의의 데이타를 웹 애플리케이션에 보내는 프로그램을 작성하지 않아야 한다. 일반적으로 서버는 클라이언트가 이 검사를 보안적으로 수행하도록 할 수 없기 때문에 모든 자신의 입력 (폼 데이타, 쿠키 등) 에 대해 검사를 수행해야 한다. 요약하면 일반적으로 클라이언트는 ``신뢰할 수 있는 채널"이 아니라는 것이다. 이에 대한 더욱 자세한 정보는 6.9절 을 보라.

마이크로소프트사의 Active Server Pages (ASP) 를 사용하는 사람들은 입력 유효화에 대한 짧은 논의를 http://heap.nologin.net/aspsec.html 의 Jerry Connolly 로부터 얻을 수 있다.