2013-09-02 5 views
0

나는이 질문을 여러 번 보았지만 강제로 다운로드 할 수있는 코드로 많은 작업을해야하며, 그로 인해 발생할 수있는 "보안"문제에 대해 아무 것도 발견하지 못했습니다. 나는 사람들이 로그인 후 물건을 다운로드하기를 원한다. (hotlinking을 막기 위해). htaccess와 PHP로이 문제를 해결하려고합니다. PHP 파일은 로그인을 검사하고 OpenId (무언가)도 가지고 있습니다.안전하게 다운로드 할 수있는 파일

$url = "{$_SERVER['DOCUMENT_ROOT']}/myfolder/{$myfile}"; 

    if(!is_file($url)) { 
    //whatever 
    }elseif (is_file($url)){ 

    switch($url['extension']) { 
      case 'pdf': $ext = 'application/pdf'; break; 
      case 'zip': $ext = 'application/zip'; break; 
      case 'pps': $ext = 'application/vnd.ms-powerpoint'; break; 
      case 'pptx': $ext = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'; break; 
      case 'docx': $ext = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; break; 
      default: $ext = 'application/force-download'; 
     }  
     header('Pragma: public'); 
     header('Expires: 0'); 
     header("Content-Type: application/force-download"); 
     header("Content-Type: application/octet-stream"); 
     header("Content-Type: application/download");  
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Cache-Control: private',false); 
     header('Content-Type: '.$ext); 
     header('Content-Disposition: attachment; filename="'.basename($url).'"'); 
     header('Content-Transfer-Encoding: binary'); 
     header('Connection: close'); 
     readfile($url); 
     exit(); 
    } 

Myfolder가 모두 거부 htaccess로 보호되어 다음과 같이 다운로드 부분이다. 나는 이것이 충분히 안전한지 불확실하다. 그래서 나는 끔찍하게 불안전 한 것을하기 전에 내가 묻는다. 나는 그 사람들이 "당신의 소중한 스크립트"를 다운로드 할 수 있다는 것을 읽었지 만 나는 (PHP는, 내가 아는 한, 다운로드 할 수 없다) 어떻게 보이지 않는다. 제가 XSS를 제외하고 심각한 취약점이 있다고 생각합니까? 그렇다면이 페이지의 어딘가에서 처리되고 있습니까? 미리 감사드립니다.

+2

이 스크립트가 작동한다고 생각하지 않습니다. 헤더 앞에는 어떤 것을 울릴 수 없습니다. – Dexa

+0

죄송합니다. 디버그되었습니다. 하지만 실제로 불행하게도 작동합니다. – tattvamasi

답변

1

의견에 이미 언급되었으므로 echo과 함께 콘텐츠를 보낸 후에는 헤더를 보낼 수 없습니다.

또한 파일 경로를 생성하는 데 사용하는 $myfile var의 삭제를 확인한 다음 realpath을 사용하여 결과 경로가 "허용 된"경로 목록에 있는지 다시 확인하십시오. 그렇지 않으면 누군가가 ../../../supersecret/file과 같은 것을 전달할 수 있고 문제가 생길 수 있습니다.

+0

에코를 대단히 죄송합니다. 편집했습니다. 내가 처음부터 무언가를 할 때, 나는 기초를 테스트하고 조금 더 복잡한 것을 만들어 간다. helloworld 테스트에있는 것을 꺼내지 않는다면 (게시자가 바보이고 잘못 입력했기 때문에 {$ _SERVER [ 'DOCUMENT_ROOT']}) 게시하는 것이 더 좋았을 것입니다. $ myfile은 새 니타 이징되지만 그 부분을 복사하지 않았습니다 (이미 너무 깁니다). 나는 $ _POST로 var를 넘겨주고 (왜냐하면 일반적인 규칙으로 나를 걱정하기 때문에) 그리고 그것을 위생적으로 만든다. realpath 주셔서 감사합니다. 다운로드 전에 파일 확장명을 확인해야한다고 생각하십니까? – tattvamasi

+1

다운로드를 허용하는 디렉토리에 다운로드 가능한 파일 만있는 경우 (좋은 생각이 될 수 있음) 경로 만 확인하면 충분합니다. – lafor

관련 문제