몇가지 이유로 인해 PHP를 서버 소프트웨어(아파치 등)의 모듈로
사용하지 않거나, 다른 종류의 CGI wrappers로 스크립트에 대해
안전한 chroot와 setuid 환경을 제공하기 위해 CGI
바이너리로 PHP를 사용하는 것을 선택할 수 있습니다.
이 설치는 보통 실행 가능한 PHP 바이너리를 웹서버 cgi-bin 디렉토리에
두는 것입니다. CERT 권고 » CA-96.11는
어떠한 인터프리터도 cgi-bin에 두지 않을 것을 권장합니다. PHP 바이너리는
독립 인터프리터로 사용할 수 있지만, 이러한 방법의 설치가 가능하도록 하는
몇가지 공격을 방지하도록 설계되어 있습니다.
시스템 파일에의 접근: http://my.host/cgi-bin/php?/etc/passwd
URL 후의 물음표(?)에 존재하는 질의 정보는 CGI 인터페이스에 의해
인터프리터에 명령줄 인수로 전해집니다. 보통 인터프리터는
명령줄의 첫 인수에 지정한 파일을 열고 실행합니다.
CGI 바이너리로 호출할 때, PHP는 명령줄 인수를 해석하는 것을
거절합니다.
서버의 어떠한 웹 문서로의 접근: http://my.host/cgi-bin/php/secret/doc.html
PHP 바이너리 이름 뒤의 URL의 경로 정보 부분,
/secret/doc.html는 일반적으로
CGI 프로그램에 의해 그 이름의 파일을
열고 해석하도록 사용합니다. 보통 몇몇 웹 서버 환경 설정
지시어(아파치: Action)는 PHP 인터프리터에 http://my.host/secret/script.php 등의
요청으로 리다이렉트하도록 합니다. 이러한 설치로는, 웹 서버는
우선 디렉토리 /secret에 대해
접근 권한을 확인하고, 리다이렉트된 요청 http://my.host/cgi-bin/php/secret/script.php을
생성합니다. 불행하게도, 이러한 형식으로 요청이 주어지면,
/secret/script.php에 대한 접근 확인은
이루어지지 않고, 단순히 /cgi-bin/php
파일만을 확인합니다. 이 방법으로 /cgi-bin/php에 접근할 수 있는 어떠한 유저라도
웹 서버로 보호된 어떠한 문서라도 접근할 수 있습니다.
PHP에서는, 서버 문서 트리에 접근 제한을 가진 어떠한 디렉토리가
존재한다면, 컴파일시의 환경설정 옵션 --enable-force-cgi-redirect,
실행시 환경설정 지시어 doc_root와 user_dir를 사용하여 이 공격을
방지할 수 있습니다. 여러가지 조합에 관한 자세한 설명은 아래쪽을
참고하십시오.