2010-05-28 4 views
4

사용자가 텍스트 파일 (PDF 또는 doc)을 서버에 업로드 할 수있는 스크립트가 있습니다. 그런 다음 원시 텍스트로 변환 할 계획입니다. 그러나 파일이 변환 될 때까지 원시 형식으로되어있어 바이러스와 모든 종류의 불쾌한 점에 대해 걱정하게 만듭니다.PDF 또는 .doc 및 보안 업로드

이러한 알 수없는 파일의 위험을 최소화하기 위해 필요한 모든 아이디어. 깨끗한 지 확인하는 방법, 또는 서버가 크래시가 발생하지 않는다고 주장하는 형식인지 여부를 확인하는 방법.

답변

4

를 업로드 된 파일을 실행하지 않습니다하지만 정말 질문에 대한 대답입니다.

PHP> = 5.3 인 경우 finfo_file()을 사용하십시오. 이전 버전의 PHP를 사용하는 경우 mime_content_type() (덜 신뢰할 수 있음)을 사용하거나 PECL에서 Fileinfo 확장을로드 할 수 있습니다.

이러한 기능을 모두

는 (그 안에서 데이터의 유형을 보면) 파일의 MIME 타입을 돌려줍니다. PDF의 경우

text/pdf 

doc의 경우 몇 가지 일 수 있습니다. 서버가 * nix에서 스크립트가 다음 저장하고있는 파일이 실행되지 않습니다 있는지 확인하십시오 실행하는 경우 일반적으로는

application/msword 

을해야합니다. 더 나은 점은 웹 서버에서 액세스 할 수없는 폴더에 저장하는 것입니다. 파일에 액세스 할 수있는 코드를 작성할 수는 있지만 웹 페이지를 요청하는 사용자는 파일에 액세스 할 수 없습니다.

+0

'mime_get_contents()'가 존재합니까? 'mime_content_type()'을 의미합니까? – alex

+0

@alex - oops! 너의 권리. 그것을 file_get_contents와 혼합합니다. 나는 그것을 고치기 위해 나의 지위를 바꾸고있다. 감사! – Cfreak

1

흠 - imho 당신은 정말로 문서 유형이나 무엇인가에 대해 걱정할 필요가 없습니다. 좋은 변환기를 사용하여 원시 텍스트로 변환하면 서버를 손상시키지 않고 이러한 검사를 수행해야합니다.

클라이언트 컴퓨터에서 알 수있는 바와 같이

는, 서버는 항상 바이러스 및 공격으로부터 보호되어야한다 - 그래서 새로 업로드 된 파일을 처리하기 전에 확인하는 것입니다.

나는 웹 앱이 그 자체 검사를 한 번도 본 적이 없다 - 근사한가?

1

IMHO, 뭔가를 실행하려고 할 때까지는 단지 파일 일뿐입니다. 그러나 파일 확장자를 확실히 확인할 수는 있지만 파일 형식을 조사하여 확인할 수있는 파일 헤더의 특성 시퀀스가 ​​있는지 알아볼 수 있습니다.

+2

안돼, 안돼, 안돼! 너에게 무엇이든을 말하기 위하여 파일 확장에 결코 의지하지 말라. 이전 버전에서는 PHP> 5.3에서 finfo_file()을 사용하거나 이전 버전에서는 mime_content_type()을 사용하십시오. – Cfreak

+0

죄송합니다. 명확하지 않았습니다. * 파일 확장자에 * 의존하지 않을 것입니다. * 잘못된 * 확장자가있는 파일은 제외 할 수 있습니다. 물론, 당신이 찾은 일치하는 확장에 어떤 신뢰도 두지 않는다면, 그 검사는 쓸모없는 오버 헤드로 간주 될 수 있습니다. 사용자에게 "죄송 합니다만, 문서 및 pdf 만 수락 함"이라고 말하고 싶을 때 유용 할 수 있습니다. – Aerik

1

PDF를보고있는 경우 바이러스 백신을받을 수 밖에없고 에 악의적으로 형성된 PDF가 있다는 메시지 만 표시됩니다.

변환 소프트웨어는 일반적으로하지만 대상이되지 않는다, 그래서 당신은 단지 그것을 변환하고 텍스트 형식으로 출력을 볼 경우, 당신은 어느 정도 안전해야한다.


오, 당신은 서버에 대해 우려하고있다. 내가 Aerik에 주석으로 그냥 ...

2

서버에서 사용자가 업로드 한 파일을 열거 나 실행 한 적이 있으면 서버가 손상되었을 것으로 예상됩니다.

JPG도 실행 가능한 PHP를 포함 할 수 있습니다. include 또는 require 파일을 스크립트에 저장하면 서버가 손상 될 수 있습니다. 당신이 웹상에서 우연히 발견 한 이미지는 이렇게 게재되었습니다 ...서버에 phpinfo()를 실행합니다 저장하고 그래서 같이 자신의 서버에 재 호스트

 

header('Content-type: image/jpeg'); 
header('Content-Disposition: inline; filename="test.jpg"'); 

echo file_get_contents('/some_image.jpg'); 
echo '<?php phpinfo(); ?>'; 

...

 

$q = $_GET['q']; // pretend this is sanitized for the moment 
header('Content-type: '.mime_content_type($q)); 
header('Content-Disposition: inline; filename="'.$_GET['q'].'"'); 

include $q; 

.... 그러면 사이트 사용자는 단순히 이미지를 바탕 화면에 저장하고 메모장으로 열어 서버 설정을 볼 수 있습니다. 단순히 파일을 다른 형식으로 변환하면 해당 스크립트가 삭제되고 파일에 첨부 된 실제 바이러스는 트리거되지 않습니다.

업로드 할 때 바이러스 검색을하는 것이 가장 좋습니다. 검사기에 대한 인라인 시스템 명령을 수행하고 출력을 구문 분석하여 발견되는지 확인해야합니다. 사이트 사용자는 어쨌든 다운로드 한 파일을 확인해야합니다.

그렇지 않으면 서버에 앉아서 바이러스를 업로드 한 사용자 업로드 파일조차도 내가 아는 한 아무 것도 해가되지 않아야합니다. 이 시체는 URL별로 액세스 할 수 없었다 의미 당신의 WWW 폴더 외부에 넣어 당신은 (ReadFile을 사용해야합니다 최고의 : 하나 더 나은 가장 안전한 다른 서버에 넣어 파일 업로드 파일에

0

는이 보안의 3 방법) 또는 get_content를 사용하여 파일을 읽고 표시 last : WWW에 파일을 저장하고 다른 사람이 파일을 실행하거나 알 수없는 파일을 넣지 못하게하는 .htaccess를 폴더에 사용합니다. 파일 업로드로 수행 할 작업입니다. 웹 루트 외부에 배치하고 데이터베이스에 가짜 이름을 저장하고 알고리즘으로 파일의 실제 이름을 생성합니다. 내가 여기처럼

웹 루트 이외의 파일을 업로드 한 후이 파일의 내용이 문서라도이다 액세스 할 수 caleed getfile.php : 당신이 파일을 표시해야 src 파일 또는 모든의

<?php 

    define('DS', DIRECTORY_SEPARATOR); 
//fake name of file 
    $uniqueid = $_GET['uniqueid']; 
//file extension 
    $ext = $_GET['ext']; 
    if (isset($_GET['dir'])) 
//check address doenot contain .. 
     $addrss = str_replace('..', '_', $_GET['dir']); 
    $baseaddress = '..' . DS . 'foldername outside of web root'; 
    if ((isset($_GET['uniqueid']) and strlen($uniqueid) === 32) and (isset($_GET['ext']) and strlen($ext) === 3)) { 
     $path = $baseaddress . DS . $addrss . DS; 
     $path .= md5($uniqueid . $uniqueid . $uniqueid . $ext.'*#$%^&') .'.'. $ext; 
     if (file_exists($path)) { 
    //you can check for all your accessible extension i just use for img 
      switch ($ext) { 
       case 'jpg': 
        $content_type = 'image/jpeg'; 
        break; 
       case 'png': 
        $content_type = 'image/png'; 
        break; 
       case 'gif': 
        $content_type = 'image/gif'; 
        break; 
      } 
      header('Content-type: ' . $content_type . ' '); 
      $file = readfile($path); 
     } 

이 (이것은 내 이미지입니다) :

<img src="/getfile.php?uniqueid=put fake file name here&amp;ext=put extension here&amp;dir=put rest of file address here" > 

는 당신이 더 많은 질문을 물어 주저하지 수도 있었죠 도움이 희망

관련 문제