2012-04-23 9 views
1

내 사이트가 "500 내부 서버 오류"종종 늦게, 그리고 호스트는이 bundle.css.php 스크립트가 이유가 될 수 있음을 조언했다 고통되었습니다 일으키는 이유는 ...스크립트 500 내부 서버 오류

<?php 
ob_start('ob_gzhandler'); 
header('Content-Type: text/css'); 
$files = split(",",$_GET['files']); 
foreach($files as $key=>$val){ 
    if(file_exists($val.'.css')){ 
     include_once($val.'.css'); 
    }else{ 
     echo "\n\n/*** File \"$val\" does not exist. ***/\n\n"; 
    } 
} 
?> 

내 호스트의 말로 ...

"모든 출력을 ob_gzhandler에 버퍼링하려고합니다. GET 변수 'files'에 전달 된 매개 변수의 매우 안전하지 않은 목록을 취한 다음이를 포함하려고합니다. 파일을 출력으로. 어떤 매개 변수 목록이 전달되는지 정확히 모르겠지만 스크립트의 어딘가에 파일 이름의 큰 배열을 전달하는 버그가있는 것 같습니다. 이 스크립트로, 너무 커서 버퍼링 된 객체를 만들려고합니다. "

이것은 내 전문 기술을 넘어선 것이므로 문제를 해결할 수있는 조언을 많이 주시면 감사하겠습니다. 많은 감사합니다.


UPDATE

에러 로그 같은 라인 가득 ...

[월 4월 15시 44분 41초 2,012 23] [오류] 클라이언트 xx.xx.xx. XX] (12) 메모리를 할당 할 수 없습니다 : 자식 프로세스를 만들 수 없습니다 :/옵션/suphp 경우/sbin/suphp /home/xxxxxy/public_html/xxxx.php를 들어, 리퍼러 : http://www.xxxxxxx.com/wp-content/themes/xxx/style.css

+0

알 수없는 사용자가 알 수없는 작업을 수행하고있을 때만이 기능이 실패합니까? 후자의 경우, 알려지지 않은 것을 알려주기를 원합니다. 일종의 로깅 프레임 워크를 사용하거나 코드에서 유용한 디버깅 출력을 추가하여 오류가 발생할 때보다 유용한 런타임 정보를 볼 수 있습니다. 특히,이 코드가 실패했을 때'$ _GET [ 'files']'의 값과 _actual_ 오류가 무엇인지 알기를 원할 것입니다. – David

+0

도움에 감사드립니다. 내 경험이 없으므로 어디에서 봐야할지 모르겠다. 유용한 디버깅 출력을 얻을 수있는 곳과 코드가 실패 할 때 $ _GET [ 'files']을 어떻게 결정할 지 조언 해줄 수 있습니까? 서버 로그? –

+0

확실히 서버 로그가 있어야하며 호스팅 제공 업체가 해당 정보를 얻을 수 있어야합니다. 특히 서버 로그 정보를 제공하지 않으면 다른 공급자를 찾아야합니다 :) 사용자 정의 디버깅 출력을 생성하려면 해당 코드에 대한 내용을 추가해야합니다 . 로깅 도구를 찾기 시작할 때 좋습니다. http://stackoverflow.com/q/341154/328193 – David

답변

0

여러 포인트는 여기에 고려하는 코드 설명부터 시작하여

gzip 출력 버퍼링 처리기를 시작하여 Content-Type: text/css 헤더를 내보내고, GET 양식 매개 변수의 내용을 쉼표로 분리하고, 결과 배열의 각 요소를 반복하며, 필요한 경우 각 파일을 포함하거나 로깅으로 CSS 주석을 내 보냅니다 끈.

PHP 프로세스가 출력 버퍼링과 압축을 한꺼번에 처리 할만큼 메모리가 충분하지 않은 것 같습니다. 또한 호스트가 응용 프로그램 계층 방화벽을 가지고 있기 때문에 (좋은 이유로 mod_security와 같은) 또는 PHP가 GZIP 출력 버퍼링을 지원하지 않을 수도 있습니다.

이 스크립트는 방대한 보안 구멍입니다! 이 코드를 실행하는 웹 서버가 양식 매개 변수를 변경하여 실행중인 서버의 임의의 파일을 덤프하도록 만들 수 있습니다! 프로덕션 환경에서는 사용하지 마십시오! 이제까지! 자신이하고있는 일이나 자신의 전문 지식을 벗어난 일을 이해하지 못한다면 지금은 코딩을 중단하고 새로운 일자리를 찾아야합니다.

+0

Heh; 너는 한때 외교관 이었어, 나는 말할 수있다! – halfer

+0

필자는 "필자의 전문 지식이없는"PHP 스크립터가 남긴 여러 가지 덤프를 정리했습니다. :) – jmkeyes

0

이 스크립트를 사용하려면 $ _GET 변수에 isset 함수가 설정되어 있는지 확인해야합니다. 둘째, 악의적 인 코드를 쉽게 삽입 할 수 있으므로 사용중인 변수에 사용자가 액세스하지 못하게해야합니다. , 대신 $ _POST를 사용할 수 있거나 적어도 $ _GET 변수에 전달 된 값이 영숫자인지 확인하십시오.