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
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
Pour ça, il faudrait que tu teste si l'extension est bonne avec :
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.
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 ....
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
Il faut jouer avec les requêtes HTTP, demain j'essayerais de concocter un script, je te l'expliquerais.
Alors voilà la classe :
Donc trois méthodes, trois façons de vérifier qu'un script est valide.
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; } } } ?>
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
Partager