2010-01-16 3 views
1

나는 하나의 질문이있다파일 가져 오기 보안 문제

우리가 웹 사용자에게 옵션을 주어서 mysql 테이블로 데이터를 가져올 때, 이것은 안전한가요? import.php 우리가 다음 코드 한

<form method="post" action="import.php" enctype="multipart/form-data"> 

    <input id="file1" name="file1" type="file"> 

<input type="submit" name="button" id="button" value="Submit" > 
    </form> 

예를

에 대한

 <?php 
     $theFile = $_FILES['file1']; 
     $tmp_name1 = $theFile['tmp_name']; 
     $row = 1; 
     if (($handle = fopen($tmp_name1, "r")) !== FALSE) { 
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $num = count($data); 

     // SQL insert statement 
     } 
     fclose($handle); 
     } 

몇 가지 중 하나는 모든 스크립트를 업로드하거나 .exe 또는 바이러스 경우 내 질문에,이 웹 서버로 이동합니다됩니다 임시 디렉토리 어떻게 우리가 그것을 확보 할 수 있습니까?

안전한 방법은 무엇입니까? 그 부분에 문제가되지 않도록 그 코드에

감사

답변

2

. 최소한 파일이 실제로 업로드 된 파일이고/etc/passwd와 같은 서버에 이미있는 파일이 아닌지 확인해야합니다. 그렇게하려면 is_uploaded_file()을 사용해야합니다.

예 :

<?php 
if (is_uploaded_file($_FILES['file1']['tmp_name'])) { 
    $tmp_name1 = $_FILES['file1']['tmp_name']; 
    if (($handle = fopen($tmp_name1, "r")) !== FALSE) { 
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
      $num = count($data); 

      // SQL insert statement 
     } 
    fclose($handle); 
    } 
} 

>

당신도 누군가가 파일을 실행하는 경우 원격 파일 공격이 발생할 수있는 변경되지 않은 파일의 이름을 떠나기로 서버에 업로드하는 파일의 이름을 변경해야합니다 당신의? 섬기는 사람.

마지막으로, 파일 업로드 만, 특정 파일 형식을 받아들이 이미지처럼, 당신은 확실히 파일이 실제로 이미지입니다 있는지 확인해야합니다 생각됩니다. 최소한 .png, .gif, .jpg 등인지 확인하려면 파일 확장자를 확인하십시오. .exe 인 경우 이미지가 아니므로 즉시 사용을 거부하십시오. 따라서 사용하지 않아도됩니다. .

<?php 
    if (is_uploaded_file($_FILES['file1']['tmp_name'])) { 

     $allowedExtensions = array("txt","csv","htm","html","xml","css","doc","xls","rtf","ppt","pdf","swf","flv","avi","wmv","mov","jpg","jpeg","gif","png"); 
     if (!in_array(end(explode(".", strtolower($_FILES['file1']['name']))), $allowedExtensions)) { 
      // Bad file type. Error! 
     } 
     else { 
      $tmp_name1 = $_FILES['file1']['tmp_name']; 
      if (($handle = fopen($tmp_name1, "r")) !== FALSE) { 
       while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
        $num = count($data); 

        // SQL insert statement 
       } 
       fclose($handle); 
      } 
     } 
    } 
?>  
0

아무것도 파일을 실행합니다. 파일이 추출되면 문제가 발생할지 여부는 별도의 문제입니다.

0

당신이 어떤 파일을 실행하지 않으며, 그들이 외부에서 액세스 할 수있는 위치로 이동하지 않는 한 (즉, 웹 사이트의 폴더), 아니, 아니 보안 문제가 없다 파일에 포함 된 내용.

당신은 매우 조심해야하고 파일을 수행 할 whatevwer 당신이 할 때 이런 방식으로 오는 모든 파일을 신뢰하지해야합니다. 예를 들어 절대 실행하지 마십시오. 파일을 실행될 수있는 위치에 두지 마십시오 (예 : .php 파일이 보안되지 않은 다운로드 디렉토리에 있음).

그렇지 않으면, 정말 당신이 파일을 사용하여 수행 할 작업에 따라 달라집니다. 표준 Linux/Apache/PHP 설정에는 빠르고 쉬운 바이러스 검사 솔루션이 없습니다.

파일 업로드를 가능한 한 안전하게 만들기 위해 수행 할 수있는 일에 대해 자세히 알아 보려면 this question, 그 답변 및 특히 bobince의 답장에있는 링크를 확인하십시오. 하지 안전