Membres


Pas encore membre ?
inscrivez-vous ici

Connexion :
Login
Code
Mot de passe perdu ?
Liste des membres

Upload PHP - Cours php

Upload PHP

Upload PHP


Upload php
L'upload en PHP est utilisé au travers du web en générale d'une façon très peut sécurisé et le plus souvent ... pas du tout sécurisé. L'un des problème est que lorsque l'on apprend la programmation en PHP, on ne fais pas toujours attention à la sécurité par manque de mise. L'upload PHP n'est pas à prendre à la légère et on doit vraiment réfléchir au potentiel risques de sécurités que cela pourrai engendré.

Ceci n'est pas la sécurité OPTIMAL que je vais vous montrer ici, mais on s'en rapproche pas mal.



Voici un petit exemple de comment uploader un fichier en php.
upload php NON sécurisé - à but pédagogique et à ne pas utiliser sur un site en production !!!

<form method="post" enctype="multipart/form-data" action="">
<input type="file" name="fichier" size="30">
<input type="submit" name="upload" value="Uploader">
</form>
<?php
if( isset($_POST['upload']) ){
    
$content_dir 'upload/';

    
$tmp_file $_FILES['fichier']['tmp_name'];

    if( !
is_uploaded_file($tmp_file) )
    {
        exit(
"Le fichier est introuvable");
    }
    
    
//vous pouvez vérifier l'extension du fichier ici.

    
$name_file $_FILES['fichier']['name'];

    if( !
move_uploaded_file($tmp_file$content_dir $name_file) )
    {
        exit(
"Impossible de copier le fichier dans $content_dir");
    }

    echo 
"Le fichier a bien été uploadé";
}
?>


Voilà donc un code d'upload assès simple et qui pourrai être encore plus simple. Il contient juste la base pour allez plus loin.



upload PHP sécurisé

Maintenant, vous pouvez aussi vérifier le fichier en fonction de son extension, de son type MIME ... et aussi vérifié que le fichier ne contient pas de caractères interdit.
Voici donc une version d'upload php sécurisé :
<form method="post" enctype="multipart/form-data" action="">
<input type="file" name="fichier" size="30">
<input type="submit" name="upload" value="Uploader">
</form>
<?php
// fonction qui recupere l'extension du fichier
function getExtension($filename){
  
$ext substr(strtolower(strrchr(basename($filename), ".")), 1);
  return 
$ext;
}
// fonction qui va sécurisé le nom du fichier
function clean_file_name($var){
  
$var strtr($var,"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËéèêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ","AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn");
  
$var eregi_replace("[^a-zA-Z0-9.-]","",$var);
  return 
$var;
}


if(
$_POST['upload'])
{
  
// configuration : 
  
  // repertoire où vont être placé les fichiers
  
$content_dir $_SERVER['DOCUMENT_ROOT'].'/upload_dir/';
  
// ajouter ici les autres extensions que vous autorisé
  
$extensions=array('jpg','jpeg','gif','png');

  
// est ce qu'un fichier a ete selectionné ?
  
if(empty($_FILES['fichier']['name'])){
    exit(
"Aucun fichier sélectionné.");
  }
  
  
// on test si le fichier est uploadé
  
$tmp_file $_FILES['fichier']['tmp_name'];
  if( !
is_uploaded_file($tmp_file) ){
    exit(
"Le fichier est introuvable");
  }
  
  
// renommons le fichier pour plus de sécurité
  
$name_file clean_file_name($_FILES['fichier']['name']);
  
  
// on test les caracteres non valide
  
if(preg_match('#[x00-x1Fx7F-x9F/]#'$name_file)){
    exit(
"Caractères invalides détecté");
  }
  
  
// est ce que l'extension est valide ?
  
if(!in_array(getExtension($name_file),$extensions)) {
    exit(
"Le format de votre fichier n'est pas autorisé.");
  }

  
// upload
  
if(!move_uploaded_file($tmp_file,$content_dir.$name_file)){
    exit(
"Impossible de copier le fichier !");
  }else{
    echo 
"Le fichier a bien été uploadé";
  }
  
}
?>



Voici un autre exemple d'upload PHP sécurisé

Upload très simple

- Stockage : dans un répertoire accessible depuis un navigateur
- Nommage : ajout d'une clef unique devant le nom des fichiers
- Fichiers / répertoires :
/index.php
/upload_dir/
/upload/dir/.htaccess

1) Créer le répertoire qui va contenir les fichiers et placer un fichier .htaccess avec ce contenu :
php_flag engine Off
(ceci permet d'empécher l'exécution de PHP dans ce répertoire)

2) créer le fichier index.php :

<?php
function safer_file_name($var)
{
    
//plus d'accent
    
$var htmlentities($varENT_NOQUOTES'iso-8859-1');  // si votre site est en utf-8, faut changer l'encodage)
    
$var preg_replace('#\&([A-za-z])(?:uml|circ|tilde|acute|grave|cedil|ring)\;#''\1'$var);
    
$var preg_replace('#\&([A-za-z]{2})(?:lig)\;#''\1'$var);
    
$var preg_replace('#\&[^;]+\;#',''$var);

    
// on enlève apostrophe / espace
    
$var strtolower($var);
    
$var str_replace("'","-",$var);
    
$var str_replace("\"","-",$var);
    
$var str_replace(" ","-",$var);

    
// on enlève le reste
    
$var preg_replace('#[^a-z0-9\.-]#',''$var);

    return 
$var;
}

function 
upload($_files$destination_rep)
{
    if(!empty(
$_files['fichier']['tmp_name']) && !empty($_files['fichier']['name']))
    {
        
$tmp_file $_files['fichier']['tmp_name'];

        
//on test si l'upload a reussi
        
if(!is_uploaded_file($tmp_file))
            exit(
'Erreur lors de l\'upload.');

        
// on va ajouter une chaine pour rendre le nom du fichier unique et pratiquement introuvable.
        
$unikifier md5(uniqid('A'5));

        
// nettoyage du nom du fichier (on peux pas d'accents ou d'espace)
        
$file_name safer_file_name($_files['fichier']['name']);

        
// on y ajoute la chaine pour rendre le nom de fichier unique
        
$file_name $unikifier.'_'.$file_name;

        
//on déplace le fichier vers notre répertoire de destination
        
if(!move_uploaded_file($tmp_file$destination_rep.$file_name))
            exit(
"Impossible de déplacer le fichier. Upload annulé.");
        else
            return 
$file_name;
    }
}


$file_dir './upload_dir/';

if(
$_POST || $_FILES)
{
    
$file upload($_FILES$file_dir);
    echo 
'Upload terminé : '.$file;
}
else
{
    echo 
'
    <form method="post" enctype="multipart/form-data" action="">
        <input type="file" name="fichier" size="30">
        <input type="submit" name="upload" value="Uploader">
    </form>'
;
}
?>



On pourrai allez plus loin ? OUI !
Il faudrai définir le répertoire d'upload dans un endroit NON accéssible depuis un navigateur web, renommer complètement le fichier, vérifié que le fichier ne contient pas (DANS le fichier) du code PHP ou autre, vérifié le type MIME et faire une contre vérification avec l'extension. Mais bon, ceci est abordé dans le script d' upload sécurisé myPHPupload


Bon upload php !

Le 16/03/2010 par Sky
http://www.graphiks.net




Les commentaires
  • Le 22-02-2008, Zzzzz a écrit :
    je vient de tester et c'est assès chiader comme idée. Pas mal du tout !

  •  
  • Le 16-01-2008, Baloo a écrit :
    Sympa, c'est vraiment assès sécurisé pour une fois! Merci pour le script d'upload !

  •  
  • Le 10-11-2007, tiupPo a écrit :
    Merci beaucoup pour cet exemple d'upload en PHP. ça change des autres site qui propose uniquement des solutions partiellements sécurisés.

  •  

Nom :

Texte :

Recopier ce code : ici

Nous  -  Plan du site  -  Informations légale  -  Contact  -  © Graphiks.net