4.11. 비질의를 수행하는 HTTP GET 을 금지해라

HTTP 를 사용하는 웹 기반 애플리케이션은 질의외의 다른 것에 대해 HTTP ``GET" 또는 ``HEAD" 메쏘드를 사용하지 못하도록 한다. HTTP 는 여러가지 많은 메쏘드들을 포함하고 있는데 가장 널리 사용되고 있는 두가지 메쏘드는 GET 과 POST 이다. GET 과 POST 모두 폼으로 데이타를 전송하는데 사용할 수 있는데 GET 메쏘드는 URL 로 데이타를 전송하는 반면 POST 메쏘드는 데이타를 개별적으로 전송한다.

비질의 (데이타 변경, 돈 이체 또는 서비스 서명과 같은) 를 수행하기 위해 GET 메쏘드를 사용할 때의 보안 문제는 공격자가 악의있는 폼 데이타를 포함하는 URL 과 하이퍼텍스트 링크를 생성할 수 있다는 것이다. 공격자가 속는 사람이 링크 (하이퍼텍스트 링크의 경우) 를 클릭하거나 또는 그저 페이지 (HTML 의 img 태그를 갖는 이미지와 같은 다른 곳에 포함된 transcluded 정보의 경우) 를 보도록 납득시킨다면 속는 사람은 GET 을 수행할 것이다. GET 이 수행될 때 공격자가 생성한 모든 폼 데이타는 속는 사람에 의해 지정된 링크로 보내질 것이다. 이것이 6.13절 에서 심도있게 논의될 cross-site malicious attack 이다.

악의있는 cross-site 공격이 수행할 수 있는 단 하나의 동작은 사용자로 하여금 예상치 못한 데이타를 보도록 하는 것으로 이는 그다지 심각한 문제는 아니다. 그러나 이 능력을 이용해서 어떤 공격을 행할 수 있기 때문에 여전히 문제가 될 수 있다. 예를 들어 비합법적인 또는 연루시킬 수 있는 자료 (material) 을 요청하는 것으로부터 나올 수 있는 예기치 못했지만 실제 세계에 영향을 끼칠 수 있는 무엇인가를 요청하는 사용자때문에 또는 사용자로 하여금 보통은 노출될 수 없지만 공격자에게 노출될 지 모를 어떤 방식으로 정보를 요청하게끔 함으로써 프라이버시가 손실될 가능성이 있다. 그러나 악의적인 공격자가 데이타 보기만이 아니라 cross-site 링크를 통해 데이타 변경을 야기할 수 있다면 더욱 더 심각한 효과를 야기할 수 있다.

대부분의 CGI 라이브러리와 같은 전형적인 HTTP 인터페이스는 데이타를 얻는데 있어 GET 과 POST 를 동일한 방식을 갖는 메쏘드로 다루는 것이 도움이 되기 때문에 보통 이 둘의 차이를 감춘다. 그러나 실제로 데이타 질의이외의 무엇인가를 야기하는 동작에 대해서는 요청이 POST 이외의 어떤 것인지를 알기 위해 검사해라; 만약 그렇다면 주어진 데이타로 채워진 폼을 보여서 사용자들에게 그들이 요청한 것인지를 확인하도록 물어라. 이는 cross-site malicious content 공격을 예방할 것이며 동시에 한 번의 클릭으로 동작을 확인케 하는 편의성을 사용자에게 제공하는 것이다.

정말 이 동작은 HTTP 스펙에 의해 강력히 추천되고 있다. HTTP 1.1 스펙 (IEFT RFC 2616 9.1.1. 절) 에 따르면 GET 과 POST 메쏘드는 검색이외의 다른 동작을 취하는 의미를 가져서는 안된다. 이러한 메쏘드들은 안전하다고 고려되어야 한다. 이는 사용자 에이전트로 하여금 특별한 방식으로 POST, PUT 과 DELETE 와 같은 다른 메쏘드를 나타낼 수 있게 하며 따라서 사용자는 아마도 안전하지 못한 동작이 요청되고 있다는 사실을 알게 된다.