TL; DR-수정 (필요하지 않을 수도 있음)은 매우 간단 하며이 답변의 끝 부분에 있습니다.
특정 질문에 답하려고 노력할 것입니다. 그러나 PATH_INFO가 무엇인지에 대한 당신의 오해는 질문 자체를 조금 잘못합니다.
첫 번째 질문은 "이 경로 정보 비즈니스 란 무엇입니까?"
당신의 다음 질문은 했어야 : "어떻게 PHP는 무엇을 결정 하는가 PATH_INFO
하고 SCRIPT_FILENAME
있다?"
- PHP의 이전 버전은 기술적으로도 지원하지 않았다 순진했고
PATH_INFO
있어야했다 그래서 무엇 PATH_INFO
에 munged 한 SCRIPT_FILENAME
예, 많은 경우에 고장,있다. 테스트 할만큼 오래된 버전의 PHP가 없지만 SCRIPT_FILENAME
위의 예제에서 "/path/to/script.php/THIS/IS/PATH/INFO"라는 전체 내용을 볼 수 있습니다. 평소와 같이 docroot).
- 활성화 cgi.fix_pathinfo으로, PHP는 올바르게 "/ 본 / IS / PATH / INFO"위의 예를 찾아로두고
PATH_INFO
하고 SCRIPT_FILENAME
(물론 docroot에 접두사) 요청 된 스크립트를 가리키는 단지 부분을 가져옵니다.
- 참고 : PHP가 실제로 지원하기 시작했을 때
PATH_INFO
, 새로운 기능에 대한 구성 설정을 추가해야 이전 동작에 의존하는 스크립트를 실행하는 사람들이 새로운 PHP 버전을 실행할 수있었습니다. 그렇기 때문에 구성 스위치도 있습니다. 처음부터 내장되어 있어야합니다 ( "위험한"동작으로).
그러나 PHP는 스크립트의 어느 부분과 경로 정보를 어떻게 알 수 있습니까? URI가 다음과 같은 경우 :
http://example.com/path/to/script.php/THIS/IS/PATH/INFO.php?q=foo
- 일부 환경에서는 복잡한 질문 일 수 있습니다. PHP에서 발생하는 일은 서버의 docroot 아래에 해당하지 않는 URI 경로의 첫 부분을 찾는 것입니다. 이 예제에서는 서버에 "/docroot/path/to/script.php/THIS"가 없지만 "/docroot/path/to/script.php"가 있으므로
SCRIPT_FILENAME
결정되어 PATH_INFO
나머지를 얻습니다.
- 이제 Nginx 문서와 Hrvoje Špoljar의 답변 (이러한 명확한 예에 대해 까다로울 수 없음)에 자세히 설명 된 위험의 좋은 예가 더 명확 해집니다 .Hrvoje의 예 ( " http : // example. com / foo.jpg / nonexistent.php "), PHP는 docroot"/foo.jpg "에서 파일을 볼 수 있지만"/foo.jpg/nonexistent.php "라는 파일은 보이지 않으므로"/foo.jpg "를
SCRIPT_FILENAME
얻습니다. (docroot 접두사가 붙음) PATH_INFO
"/nonexistent.php"를 얻습니다.
위험 할 수있는 이유와 방법이 명확 해졌습니다.
- 웹 서버는 실제로 잘못이 아닙니다. URI로 PHP를 프록시하는 것입니다. "foo.jpg"에 실제로 PHP 내용이 포함되어 있다는 사실을 순진하게 찾아서 실행합니다. 이것은 Nginx 자체에 국한 되지 않습니다 .
- 진짜 문제는 신뢰할 수없는 콘텐츠는 살균하지 않고 어딘가에 업로드 할 당신이 그것을 할 수있는 PHP가 행복하게 실행 동일한 위치에 다른 임의의 요청을 허용 할 수 있다는 것입니다.
Nginx와 Apache는이 속임수를 사용하여 요청을 방지하도록 빌드하거나 구성 할 수 있으며 user2372674의 답변을 포함하여이를 수행하는 방법에 대한 많은 예제가 있습니다 . 이 블로그 기사 는 문제를 훌륭하게 설명하지만 올바른 해결책이 없습니다.
그러나 가장 좋은 해결책은 ".php"로 끝나지 않는 한 파일을 실행하지 않도록 PHP-FPM이 올바르게 구성되어 있는지 확인하는 것입니다. 최신 버전의 PHP-FPM (~ 5.3.9 +?)이 기본값으로 설정되어 있으므로이 위험은 더 이상 문제가되지 않습니다.
해결책
최신 버전의 PHP-FPM (~ 5.3.9 +?)이있는 경우 아래의 안전한 동작이 이미 기본값이므로 아무 것도 수행하지 않아도됩니다.
그렇지 않으면 php-fpm의 www.conf
파일을 찾으 /etc/php-fpm.d/www.conf
십시오 (시스템에 따라 다름). 이것을 가지고 있는지 확인하십시오 :
security.limit_extensions = .php
다시 말하지만, 요즘 많은 곳에서 기본값입니다.
이로 인해 공격자가 ".php"파일을 WordPress 업로드 폴더에 업로드하고 동일한 기술을 사용하여 파일을 실행하는 것을 막을 수는 없습니다. 여전히 애플리케이션에 대한 보안이 우수해야합니다.