IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Upload] Limiter l'upload aux fichiers HTML corrects


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [Upload] Limiter l'upload aux fichiers HTML corrects
    bonjour,
    Je travaille sur un site permettant l'upload de fichiers et j'aimerais n'autoriser
    que les fichiers html,css ou php corrects(ie sans erreurs)
    vis à vis du validateur w3c
    merci d'avance

  2. #2
    Membre régulier Avatar de Rodrick
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 92
    Points : 91
    Points
    91
    Par défaut
    Pour ça, il faudrait que tu teste si l'extension est bonne avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $extensions_ok = array('html', 'htm', 'php', 'css');
              $ext = strtolower(substr(strrchr($_FILES['image']['name'], '.'), 1));
              if( !in_array($ext, $extensions_ok ) )
                  echo("<b>Le fichier n'est pas valide</b>");
              else
                   ....
    Mais attention car l'utilisateur peut mettre en place une requête ou une fonction qui supprimerait les fichiers chez ton hébergeur et là je n'ai pas d'idées pour l'instant mais je te tiens au courant.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonsoir à tous

    J'ai toujours le même probleme.

    Je souhaite sur une application autoriser l'upload de fichiers html ,css ,php
    mais uniquement si lorsque l'on passe ces derniers au validateur en ligne du w3c
    il n"y ai aucune erreur.
    Donc un utilisateur transmet ses fichiers ,s'ils sont validés je les copie sinon je signale qu'ils ne sont pas conformes et les rejette.

    Je suis preneur de toutes vos pistes notamment celle d'installer un validateur en local sur mon serveur.(Je ne sais pas si c'est possible ni comment faire ).
    merci

  4. #4
    Membre du Club Avatar de Atikae
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 56
    Points
    56
    Par défaut
    Il faut jouer avec les requêtes HTTP, demain j'essayerais de concocter un script, je te l'expliquerais.

  5. #5
    Membre du Club Avatar de Atikae
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 56
    Points
    56
    Par défaut
    Alors voilà la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    <?php
     
    class Validateur 
    {
     
        private $adresseValidateur = 'http://validator.w3.org/check';
     
     
        /* $url est l'adresse url à vérifier */
        public function HtmlUrl($url)
        {
            $web = parse_url($this->adresseValidateur);
     
            // On ouvre une connection avec le validateur et, par la même occasion, on test si la connection a été établie.
            if(!$connect = fsockopen($web[host], 80)) {
                return FALSE;
            } else {
     
     
                //On envoie une requête http simple au validateur
                fputs($connect, "HEAD $this->adresseValidateur?uri=$url HTTP/1.1\r\n");    
                fputs($connect, "Host: $web[host]\r\n");
                fputs($connect, "Connection: Close\r\n\r\n");
     
     
                $reponse = array();
                $i = 0;
     
                // On réceptionne la réponse à notre requête et on la place dans $reponse
                while (!feof($connect)) { 
                    $reponse[$i] = fgets($connect, 1024);
                    $i++;
                }
     
                // On a finis notre dialogue avec le validateur, on ferme la connection
                fclose($connect);
     
                // On convertit le tableaux $reponse en texte.
                $reponse = implode(' ' , $reponse);
     
                //On vérifie si la réponse du validateur est positive
                if (preg_match('#X-W3C-Validator-Status: Valid#', $reponse)) {
                    return TRUE;
                } else {
                    return FALSE;
                }
            }
        }
     
        /* $contenu est le code source à vérifier */
        public function HtmlFragment($contenu) 
        {
            $web = parse_url($this->adresseValidateur);
     
            // On ouvre une connection avec le validateur et, par la même occasion, on test si la connection a été établie.
            if(!$connect = fsockopen($web[host], 80)) {
                return FALSE;
            } else {
     
                $contenu = 'fragment='.urlencode(utf8_encode(stripslashes($contenu)));
     
                //On envoie une requête http avec la méthode POST au validateur
                  fputs($connect, "POST $this->adresseValidateur HTTP/1.1\r\n");
                  fputs($connect, "Host: $web[host]\r\n");
                  fputs($connect, "Content-type: application/x-www-form-urlencoded\r\n");
                  fputs($connect, "Content-length: ".strlen($contenu)."\r\n");
                  fputs($connect, "Connection: close\r\n\r\n");
                  fputs($connect, $contenu . "\r\n\r\n"); 
     
     
                $reponse = array();
                $i = 0;
     
                // On réceptionne la réponse à notre requête et on la place dans $reponse
                while (!feof($connect)) { 
                    $reponse[$i] = fgets($connect, 1024);
                    $i++;
                }
     
                // On a finis notre dialogue avec le validateur, on ferme la connection
                fclose($connect);
     
                // On convertit le tableaux $reponse en texte.
                $reponse = implode(' ' , $reponse);
     
                //On vérifie si la réponse du validateur est positive
                if (preg_match('#X-W3C-Validator-Status: Valid#', $reponse)) {
                    return TRUE;
                } else {
                    return FALSE;
                }
            }
        }
     
     
        /* $name c'est le tmp_name du fichier qui vient d'être uploadé */
        public function HtmlFichier($name)
        {
            // On récupère le contenu du fichier temporaire
            $contenu = file_get_contents($name);        
     
            // On envoie ce contenu à l'autre méthode HtmlFragment
            if($this->HtmlFragment($contenu)) {
                return TRUE;
            } else {
                return FALSE;
            }
        }
    }
     
    ?>
    Donc trois méthodes, trois façons de vérifier qu'un script est valide.
    Si le script est valide, la classe renvoie TRUE, sinon FALSE.

    Validation par URL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <?php
     
    include_once 'nom.de.la.classe';
    $validateur = new Validateur();
     
    // Vous passez en paramètre l'adresse URL à vérifier
     
    if ($validateur->HtmlUrl('http://www.w3.org/')) {
        echo 'Url valide HTML STRICT';
    } else {
        echo 'Url non valide HTML STRICT';
    }
     
    ?>


    Validation par copier/collé de code (via un textarea) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
     
    include_once 'nom.de.la.classe';
    $validateur = new Validateur();
     
    // Vous passez en paramètre le code source (sûrement récupérer via $_POST avec un textarea)
     
    if ($validateur->HtmlFragment($code)) {
        echo 'Code valide HTML STRICT';
    } else {
        echo 'Code non valide HTML STRICT';
    }

    Validation par fichier :

    Là c'est plus compliqué, je vous copie/colle le code d'un tutorial de Yogui (merci à lui) modifié et il prend en compte la validation. Je met en gras l'implémentation de la classe.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    <?php
    
    //
    // Fonction trouvée dans la documentation de la fonction ini_get()
    //
    function return_bytes($val) {
       $val = trim($val);
       $last = strtolower($val{strlen($val)-1});
       switch($last) {
           // The 'G' modifier is available since PHP 5.1.0
           case 'g':
               $val *= 1024;
           case 'm':
               $val *= 1024;
           case 'k':
               $val *= 1024;
       }
    
       return $val;
    }
    
    define('MAX_FILE_SIZE', return_bytes(ini_get('post_max_size')));
    define('UPLOAD_DIRECTORY', './');
    
    if(!empty($_FILES)){
    
            if(is_uploaded_file($_FILES['files']['tmp_name'])){
                $name     = $_FILES['files']['name'][$i];
                $tmp_name = $_FILES['files']['tmp_name'];
                $error    = $_FILES['files']['error'];
                $clean_name = strtolower(basename($name));
                $clean_name = preg_replace('/[^a-z0-9.-]/', '-', $clean_name);
    
                //
                // Type mime du fichier
                //
                if(function_exists('mime_content_type')){
                    // Notre système nous permet de déterminer le type réel
                    $type = mime_content_type($tmp_name);
                }
                else{
                    // Nous sommes contraints à faire confiance à l'internaute
                    $type = $_FILES['attached_files']['type'][$i];
                }
            
            include_once 'class.validator.php';
            $validateur = new Validateur();
            
            //On lui passe le nom du fichier temporaire comme argument
    
            if ($validateur->HtmlFichier($tmp_name)) {
            
                echo 'Valide !'; 
                    //
                    // Déplacement hors du répertoire temporaire
                    //
                    if(!move_uploaded_file($tmp_name, UPLOAD_DIRECTORY.$clean_name)){
                    echo "Le fichier <b>n'a pas</b> été déplacé correctement";
                    }  else{
                    echo 'Le fichier a été déplacé correctement';
                    }
            } else {
                echo 'Non valide !';
            }
            }
        }
    
    
    ?>
    
    
    <form method="post" action="<?php echo basename(__FILE__); ?>" enctype="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo MAX_FILE_SIZE; ?>" />
        <label>Fichier : <input type="file" name="files" /></label><br /><br />
    
        <input type="submit" value="Envoyer" />
        <input type="reset" value="Rétablir" />
    </form>

    Voilà voilà, je compte aussi ajouter la validation des fichier CSS, mais plus tard
    Si vous avez des réclamations, par mp

Discussions similaires

  1. Limiter l'upload d'un fichier image ?
    Par sky1989 dans le forum Langage
    Réponses: 4
    Dernier message: 27/02/2012, 11h39
  2. Difficulté d'accéder aux fichiers uploadés
    Par amnass dans le forum JSF
    Réponses: 2
    Dernier message: 06/08/2009, 15h38
  3. Réponses: 2
    Dernier message: 15/08/2007, 00h35
  4. [Upload] taille d'un fichier et limite d'upload
    Par fraizas dans le forum Langage
    Réponses: 1
    Dernier message: 07/10/2005, 12h01
  5. [Upload] Date de dernier accès aux fichiers...
    Par John@EuroDevz dans le forum Langage
    Réponses: 10
    Dernier message: 08/04/2005, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo