Sécurité des fichiers
La sécurité des fichiers avec PHP
Pendant le traitement (lecture et écriture) de fichier, certains points méritent un peu plus d'attention. Voici quelques astuces et précautions à prendre afin d'éviter les erreurs et garantir la sécurité et l'authenticité des fichiers.
Gérer le tampon : fflush
Quand on écrit des données dans un fichier, elles ne seront pas tout de suite stockées dans le fichier en question. En effet, elles seront d'abord stockées en mémoire avant d'être écrites directement dans le fichier.
Ainsi, si un autre script tente de lire le fichier au même moment, il ne lit pas forcément les données qui viennent d'être ajoutées. Les données ne sont recopiées dedans que par paquets ou à la fermeture du fichier.
La fonction fflush() offre la possibilité d'échapper à cette procédure. Elle est utilisée pour permettre l'écriture de toutes les données bufférisées qui se trouvent dans le tampon mémoire. Autrement dit, la fonction envoie tout le contenu généré dans un fichier, et retourne TRUE en cas de succès, FALSE sinon. Voici un exemple simple d'utilisation :
<?php $fp = fopen($fichier, 'w'); fputs($fp,$donnees); // Les données sont peut être encore gardées en mémoire fflush($fp); // Les données sont certainement écrites fclose($fp); ?>
La gestion du tampon trouve alors son intérêt sur l'assurance de synchronisation.
Gérer les accès concurrents : flock
PHP permet l'accès multiple à un fichier. Ainsi, plusieurs scripts peuvent écrire dans un fichier en même temps. Il en est de même pour la lecture. Dans ce cas, si deux scripts accèdent à un même fichier de façon simultanée, chacun fait comme bon lui semble. Il est fort possible qu'il n'y ait plus de cohérences dans le contenu. Le fichier peut alors se trouver incomplet, voire même corrompu.
Une précaution à prendre afin d'éviter ce type de problème serait de verrouiller le fichier pendant son utilisation et de ne relâcher le verrou que lorsque le traitement est fini. Les scripts accèdent alors un à un au fichier et le fichier n'est plus accessible par les autres scripts pendant son utilisation.
La fonction flock() permet de mettre ce verrou. Elle prend en argument le descripteur de fichier et un autre argument : le type de verrou (LOCK_SH pour un verrou partagé et LOCK_EX pour un verrou exclusif). Pour relâcher le verrou, il suffit de mettre à la place du type de verrou la valeur LOCK_UN.
Voyons tout cela plus clairement à l'aide d'un exemple.
<?php $fp = fopen($fichier, 'w'); flock($fp,LOCK_SH); // Fichier verrouillé flock($fp,LOCK_UN); //Fichier déverrouillé fclose($fp); ?>
Sécurité et fichiers
Permission et droit d'accès : chmod
Nous avons vu qu'on peut avoir un système de permission pour les droits d'accès à un fichier. La fonction chmod() vous permet quant-à elle de modifier facilement les permissions, en indiquant en argument les valeurs numériques correspondantes.
L'exemple de code ci-dessus rend le fichier "fichier.txt" accessible à la fois en écriture, en lecture, etc.
<?php chmod("/home/user/repertoire/fichier.txt", 0777); ?>
Les propriétaires de fichiers et les groupes : chown et chrgrp
Pensez à bien définir qui sont les propriétaires de tels ou tels fichiers et à gérer les groupes auxquels appartiennent les utilisateurs. Pour une modification, vous avez à votre disposition les fonctions chown() et chrgrp(). Seulement, vous devriez être un super utilisateur ou root pour pouvoir effectuer ce genre de modification.
De même, seul un propriétaire du fichier et à la fois membre du groupe peut modifier le groupe.
Autres contrôles : safe_mode et open_basedi
Nous attirons maintenant votre attention sur deux directives de configuration, dont l'activation influe beaucoup sur la gestion de sécurité du fichier. Il s'agit de safe_mode et open_basedir.
Pour éviter qu'un utilisateur puisse lire et écrire sur les fichiers des autres, la directive open_basedir effectue un contrôle complémentaire. Cette directive s'assure que tous les fichiers auxquels on va essayer d'accéder sont bien au bon endroit (C'est-à-dire dans le sous-répertoire du répertoire spécifié dans la configuration).
Le "Safe Mode" quand à elle est le mode de sécurité de PHP. A chaque fois que l'on accède à un fichier, PHP vérifie si l'utilisateur en cours est bien un propriétaire du fichier. Ceci est dû à la directive de configuration safe_mode.
En fonction de la configuration du serveur, en fonction du mode de fonctionnement de PHP, les droits alloués automatiquement sur les fichiers peuvent être différents.