Dossiers
Référence sur drupal.org : 29 Janvier 2008 – 17h59 - http://drupal.org/node/117058
Pour les débutants : assurez-vous toujours que les actions sur les fichiers (upload, visualisation, donwload, suppression) se fassent dans le dossier files ou dans tout autre dossier réservé à cet effet. Faites attention au fait que dans les exemples ci-dessous, le dossier files est codé en dur dans le code, en réalité le nom de ce dossier est paramétrable.
Les utilisateurs n’ont pas à accéder aux fichiers système (tels que /etc/password ou sites/default/settings.php). Bien que les exemples ci-dessous s’intéressent surtout à la suppression des fichiers, ayez à l’esprit que lire des fichiers quels qu’ils soient est néfaste.
<?php
/** Exemple 1 - Périlleux
* Suppression arbitraire de fichier
*
* $file est le chemin/fichier (eg files/myfile.txt) fourni par l'utilisateur.
*/
file_delete($file);
?>Dans ce premier exemple, un utilisateur malveillant peut outrepasser la confiance qui lui est donnée en fournissant des noms de fichiers dans différentes dossiers tels que /sites/default/settings.php. L’attaque est clairement limitée par les droits du compte utilisateur, qui exécute Drupal (souvent le serveur web), sur ces fichiers.
<?php
/** Exemple 2a - Périlleux
* Suppression arbitraire de fichier
*
* $file est le nom de fichier (eg. myfile.txt) fourni par l'utilisateur.
*/
file_delete("files/$file");
?><?php
/** Exemple 2b - Périlleux
* Suppression arbitraire de fichier
*
* $file est le chemin/fichier (eg files/myfile.txt) fourni par l'utilisateur.
*/
// Check whether $file is files/file
if (strpos($file, "files/") === 0) {
file_delete($file);
}
?>Les exemples 2a et 2b essaient d’atténuer l’attaque en s’assurant tout deux que le nom du fichier fourni soit précédé d’un nom de dossier. Ces deux exemples sont vulnérables à une attaque avec les dossiers parents (..).
Que se passerait-il si un utilisateur malveillant indiquait comme chemin :
Exemple 2a : ../sites/default/settings.php
Exemple 2b : files/../sites/default/settings.php
Les deux essaieront d’effacer sites/default/settings.php.
Pour une vérification correcte du vrai chemin d’un fichier, utilisez la fonction Drupal file_check_location.
<?php
/** Exemple 3
* N'est plus vulnérable aux attaques de type chemin-parent (..) .
*
* $file est le chemin/fichier (eg files/myfile.txt) fourni par l'utilisateur.
*/
// Check whether $file is files/file
if (file_check_location($file, 'files') {
file_delete($file);
}
?>- Version imprimable
- 2475 lectures
-

Commentaires récents
il y a 3 jours 9 heures
il y a 6 semaines 9 heures
il y a 10 semaines 3 jours
il y a 12 semaines 4 jours
il y a 13 semaines 4 jours
il y a 14 semaines 2 jours
il y a 16 semaines 6 jours
il y a 18 semaines 3 heures
il y a 18 semaines 3 heures
il y a 19 semaines 3 jours