Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/05/2007, 22h28   #1
Invité de passage
 
Inscription : septembre 2006
Messages : 2
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 2
Points : 0
Points : 0
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
hamid5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2007, 09h35   #2
Nouveau Membre du Club
 
Avatar de Rodrick
 
Étudiant
Inscription : avril 2005
Messages : 87
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2005
Messages : 87
Points : 39
Points : 39
Pour ça, il faudrait que tu teste si l'extension est bonne avec :

Code :
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&#039;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.
__________________
Allez une tite bière et au boulot!!!
Rodrick est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 20h20   #3
Invité de passage
 
Inscription : septembre 2006
Messages : 2
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 2
Points : 0
Points : 0
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
hamid5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 20h59   #4
Membre du Club
 
Avatar de Atikae
 
Étudiant
Inscription : avril 2007
Messages : 57
Détails du profil
Informations personnelles :
Âge : 20

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2007
Messages : 57
Points : 40
Points : 40
Envoyer un message via MSN à Atikae
Il faut jouer avec les requêtes HTTP, demain j'essayerais de concocter un script, je te l'expliquerais.
Atikae est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2007, 17h39   #5
Membre du Club
 
Avatar de Atikae
 
Étudiant
Inscription : avril 2007
Messages : 57
Détails du profil
Informations personnelles :
Âge : 20

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2007
Messages : 57
Points : 40
Points : 40
Envoyer un message via MSN à Atikae
Alors voilà la classe :

Code :
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 :
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 :
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 :
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
Atikae est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h23.


 
 
 
 
Partenaires

Hébergement Web