2010-01-16 1 views
1

J'ai une questionproblème de sécurité d'importation de fichier

lorsque nous donnons la possibilité à l'utilisateur Web d'importer des données dans la table mysql, est-ce sécurisé?

par exemple

<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> 

et nous avons import.php code suivant

 <?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); 
     } 

ma question est, si quelqu'un télécharger un script ou .exe ou d'un virus cela va au serveur web répertoire temporaire comment nous pouvons le sécuriser?

ce qui sera en toute sécurité?

Merci

Répondre

2

Ceci est et non sécurisé. À tout le moins, vous devez vérifier que le fichier était bien un fichier téléchargé et non un fichier déjà sur le serveur comme/etc/passwd. Pour ce faire, vous devez utiliser is_uploaded_file().

Exemple:

<?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); 
    } 
} 

>

Vous devez également renommer un fichier téléchargé sur votre serveur en laissant le nom du fichier inchangé pourrait conduire à une attaque de fichiers distant où quelqu'un exécute le fichier sur votre? serveur. Enfin, si le téléchargement de fichiers n'est supposé accepter que certains types de fichiers, comme les images, vous devez vérifier que le fichier est réellement une image. Au minimum, vérifiez l'extension du fichier pour vous assurer qu'il s'agit d'un fichier .png, .gif, .jpg, etc. Si c'est un fichier .exe, rejetez-le immédiatement car il ne s'agit pas d'une image et donc d'aucune utilité .

<?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

Rien dans ce code exécute le fichier de sorte qu'il n'y aura pas un problème dans cette partie. Quant à savoir s'il y aura ou non un problème une fois le fichier extrait, c'est un problème distinct.

0

Tant que vous n'exécutez aucun fichier et que vous ne les déplacez pas vers un emplacement accessible depuis l'extérieur (c'est-à-dire un dossier de votre site Web), il n'y a pas de problème de sécurité. importe ce que les fichiers contiennent.

Vous avez juste besoin d'être très prudent, et ne pas faire confiance aux fichiers qui viennent de cette façon quand vous faites tout ce que vous voulez faire pour les fichiers. Ne les exécutez jamais, par exemple. Ne les placez jamais dans un emplacement à partir duquel ils peuvent être exécutés (par exemple, des fichiers .php dans un répertoire de téléchargement non sécurisé).

Sinon, cela dépend vraiment de ce que vous voulez faire avec les fichiers. Il n'y a pas de solution de vérification antivirus rapide et facile dans une configuration Linux/Apache/PHP standard.

Pour un résumé complet de ce qui peut être fait pour rendre les téléchargements de fichiers aussi sécurisés que possible, consultez this question, les réponses et surtout le lien dans la réponse de Bobince.