저는 PHP 내부 에 대한 뉴스 그룹 게시물을 파헤 치고 주제에 대한 흥미로운 토론을 발견했습니다. 초기 스레드는 뭔가 다른,하지만 스테판 ESSER, A (아니라면하여 발언 PHP는 세계에서) 보안 전문가는 몇 게시물 $ _REQUEST를 사용하는 보안 관련쪽으로 논의를 돌았 다.
PHP 내부에 대해 Stefan Esser 인용
$ _REQUEST는 PHP의 가장 큰 디자인 약점 중 하나입니다. $ _REQUEST를 사용하는 모든 응용 프로그램은 지연된 교차 사이트 요청 위조 문제에 가장 취약합니다. (이것은 기본적으로 (age)라는 이름의 쿠키가 존재하는 경우 항상 GET / POST 콘텐츠를 덮어 쓰므로 원하지 않는 요청이 수행됨을 의미합니다.)
그리고 나중에 같은 스레드에 대한 답장에서
누군가가 GET, POST를 위조 할 수 있다는 사실에 관한 것이 아닙니다. COOKIE 변수. COOKIE가 REQUEST에서 GET 및 POST 데이터를 덮어 쓸 것이라는 사실에 관한 것입니다.
따라서 예를 들어 action = logout이라는 쿠키로 브라우저를 감염시킬 수 있으며 그날부터는 REQUEST [action]이 영원히 로그 아웃되므로 (쿠키를 수동으로 삭제할 때까지) 더 이상 응용 프로그램을 사용할 수 없습니다.
그리고 COOKIE로 당신을 감염시키는 것은 매우 간단합니다 ...
a) 하위 도메인의 모든 애플리케이션에서 XSS vuln을 사용할 수 있습니다.
b) 귀하가 a)를 소유 할 때 * .co.uk 또는 * .co.kr에 대한 쿠키 설정을 시도한 적이 있습니다. 거기에 단일 도메인?
c) 어떤 방식 으로든 다른 교차 도메인 ...
그리고 이것이 문제가 아니라고 믿으시면 * .co.kr 쿠키를 설정하여 여러 PHP 버전이 흰색 페이지를 반환하는 간단한 가능성이 있음을 알려 드릴 수 있습니다. * .co.kr의 모든 PHP 페이지를 죽이는 단 하나의 쿠키
그리고 * .co.kr에 유효한 쿠키에 + PHPSESSID = 불법 이라는 변수에 잘못된 세션 ID를 설정하면 PHP 세션을 사용하여 한국의 모든 PHP 응용 프로그램을 계속 도스 할 수 있습니다.
토론은 더 많은 게시물에 대해 계속되며 읽기에 흥미 롭습니다.
보시다시피, $ _REQUEST의 주요 문제는 $ _GET 및 $ _POST의 데이터가 아니라 $ _COOKIE의 데이터가 있다는 것입니다. 목록의 다른 사람들은 $ _REQUEST가 채워지는 순서를 변경하는 것을 제안했습니다. 예를 들어 먼저 $ _COOKIE로 채우는 것과 같이 이로 인해 세션 처리와 같은 다른 잠재적 인 문제가 발생할 수 있습니다 .
$ _REQUEST 전역에서 $ _COOKIES를 완전히 생략하여 다른 배열로 덮어 쓰지 않도록 할 수 있습니다 (사실 variable_order ini 설정 의 PHP 매뉴얼 처럼 표준 내용의 조합으로 제한 할 수 있습니다. 우리에게 말해:
variable_order EGPCS (Environment, Get, Post, Cookie 및 Server) 변수 구문 분석의 순서를 설정합니다. 예를 들어 variables_order가 "SP"로 설정되면 PHP는 슈퍼 글로벌 $ _SERVER 및 $ _POST를 생성하지만 $ _ENV, $ _GET 및 $ _COOKIE는 생성하지 않습니다. ""로 설정하면 슈퍼 글로벌이 설정되지 않습니다.
그러나 다시 말하지만, PHP에서 자신의 전역에서 환경, 가져 오기, 게시, 쿠키 및 서버에 액세스 할 수 있고 공격 벡터가 하나 더 적기 때문에 $ _REQUEST를 아예 사용하지 않는 것도 고려할 수 있습니다. 여전히이 데이터를 삭제해야하지만 걱정할 것이 하나 적습니다.
이제 $ _REQUEST가 왜 존재하고 왜 제거되지 않았는지 궁금 할 것입니다. 이것은 PHP 내부에서도 요청되었습니다. $ _REQUEST가 존재하는 이유 에 대해 Rasmus Lerdorf를 인용 합니다. PHP 내부
이와 같은 항목을 더 많이 제거할수록 사람들이 더 빠르고 더 안전한 새 버전의 PHP로 빠르게 이동하기가 더 어려워집니다. 이는 몇 가지 "추악한"레거시 기능보다 모든 사람에게 더 많은 좌절감을 안겨줍니다. 적절한 기술적 이유, 성능 또는 보안이 있으면 자세히 살펴 봐야합니다. 이 경우 우리가 살펴 봐야 할 것은 $ _REQUEST를 제거해야하는지 여부가 아니라 쿠키 데이터를 제거해야하는지 여부입니다. 내 모든 구성을 포함하여 많은 구성이 이미이를 수행하고 있으며 $ _REQUEST에 쿠키를 포함하지 않는 강력한 유효한 보안 이유가 있습니다. 대부분의 사람들은 $ _REQUEST를 사용하여 GET 또는 POST를 의미합니다. 쿠키도 포함될 수 있다는 사실을 깨닫지 못하고 악의적 인 사용자가 잠재적으로 쿠키 삽입 트릭을 수행하고 순진한 응용 프로그램을 손상시킬 수 있다는 사실을 깨닫지 못합니다.
어쨌든, 빛을 비추 길 바랍니다.