l'asile.fr


[Prog PHP ] Protection d'un répertoire

Une petite question programmation php et protection d'un repertoire

Je travail sur un Backoffice ou je dois créer un répertoire ou je donne des droits à des utilisateurs avec une session.

L'utilisateur ce log et peut aller chercher des fichiers dans un répertoire une fois logué sur le site ( listage du contenu du répertoire dans l'interface )

seulement je voudrais que les autres ou lui même ne puisse pas aller directement dans le répertoire sans passer par l'interface, mais je ne vois pas comment faire un lien entre un .htaccess et une session.

merci d'avance pour vos réponses


Dernière modification le 22/06/08 à 09:51 par gwendal
dimanche
22 juin 2008 à 09:20
 
 

gwendal a écrit
mais je ne vois pas comment faire un lien entre un .htaccess et une session.


Je ne suis pas expert en PHP, mais le lien entre l'un et l'autre n'existe pas de manière simple.

Ce qui pourrait être envisagé (mais qui semble sérieusement goret et donc possiblement non fiable) c'est d'avoir un .htaccess qui interdit tout affichage par défaut et que lors de la connexion de l'utilisateur une fonction vient remplacer le .htaccess pour ouvrir l'accès (sur la base de l'IP le temps de la connexion, par exemple, à ne pas faire si l'utilisateur passe par un proxy).

Et remise à l'état normal lors de la déconnexion ou après x minutes.

Enfin je pense qu'il y a meilleur moyen pour gérer cela uniquement via PHP, sans aller tripoter des fichiers de configuration Apache...

Ce post a été rédigé un dimanche matin tôt, je décline tout responsabilité en cas de mise en pratique de ce qui est indiqué.


dimanche
22 juin 2008 à 09:47
 
 

gwendal a écrit
Une petite question programmation php et protection d'un repertoire

Je travail sur un Backoffice ou je dois créer un répertoire ou je donne des droits à des utilisateurs avec une session.

L'utilisateur ce log et peut aller chercher des fichiers dans un répertoire une fois logué sur le site ( listage du contenu du répertoire dans l'interface )

seulement je voudrais que les autres ou lui même ne puisse pas aller directement dans le répertoire dans passer par l'interface, mais je ne vois pas comment faire un lien entre un .htaccess et une session.

merci d'avance pour vos réponses

Tu peux toujours mettre un fichier index.php et dire à apache d'utiliser ce fichier en priorité (donc pas de listage de répertoire).
Et tu ne listes les fichiers du répertoire qu'à travers un script PHP.


[?php
$dir = "/tmp/php5";

// Ouvre un dossier et liste tous les fichiers
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            echo "fichier : $file : type : " . filetype($dir . $file) . "\n";
        }
        closedir($dh);
    }
}
?]


Dernière modification le 22/06/08 à 09:57 par LeChat
dimanche
22 juin 2008 à 09:52
 
 

LeChat a écrit
Tu peux toujours mettre un fichier index.php et dire à apache d'utiliser ce fichier en priorité (donc pas de listage de répertoire).
Et tu ne listes les fichiers du répertoire qu'à travers un script PHP.


Je ne sais pas comment dire à un .htaccess qu'il doit lire par défaut un .php lors de l'accès à un répertoire ( et à ses sous rep )

et autre question, lors de mon accès via l'interface à ce repertoire pour le listage, le .htaccess ne va t'il pas lui aussi forcer la lecture du .php à la place du listage du répertoire ?


dimanche
22 juin 2008 à 10:26
 
 

J'ai la flemme, je recopie la réponse que j'ai faite sur une mailing-list il y a quelques jours, qui correspond grosso-modo :


La directive 'DirectoryIndex' permet de gérer cela : il faut indiquer
quel fichier doit être renvoyé, en testant les options l'une après l'autre :

[ url : http://httpd.apache.org/docs/2.2/mod/mod_dir.html ]

Exemple :

DirectoryIndex index.php index.html 403.html

Si le fichier 'index.php' n'existe pas le serveur cherche le fichier
'index.html' et s'il est absent il cherche un fichier '403.html'.
Par contre si ce dernier n'est pas présent, il y aura effectivement un index automatique.

Reste donc soit à modifier la règle et créer des fichiers correspondants,
soit simplement créer un fichier 'index.html' vide.

Où sinon (mais il faut avoir accès à la configuration du serveur) désactiver
le module 'mod_dir'.


dimanche
22 juin 2008 à 10:54
 
 

Merci pour vos réponses, mais je crois bien que j'ai trouvé plus simple

Il semblerait qu'il suffit de créer un répertoire en chmod 700 qui me donne droit d'accès à mes scripts, mais pas de l'extérieur du site.


Dernière modification le 22/06/08 à 11:28 par gwendal
dimanche
22 juin 2008 à 11:21
 
 

Hem, chmod 600 sans le contexte (c'est à dire l'utilisateur concerné et le groupe, et l'identifiant sous lequel ton serveur s'exécute) ça risque de ne pas protéger beaucoup.

Donne un peu plus de détails, cela permettrait de vérifier ça.


dimanche
22 juin 2008 à 11:28
 
 

en fait c'est 700


Dernière modification le 22/06/08 à 11:34 par gwendal
dimanche
22 juin 2008 à 11:29
 
 

Voilà l'exemple :

ici : url : http://www.apprendrelephp/

le fichier url : http://www.apprendrelephp/toto.php liste les fichiers présents dans le répertoire, mais si tu essaye un accès direct

url : http://www.apprendrelephp/toto/ tu ne peux pas. Cela semble fonctionner, non ? ou il y a une faille que je ne comprend pas ?


dimanche
22 juin 2008 à 11:33
 
 

J'ai crée les répertoires avec un script php qui donne un droit 0700 sur eux


dimanche
22 juin 2008 à 11:38
 
 

Effectivement ça marche, mais c'est que la configuration du serveur est assez fine : l'appartenance des fichiers est bien faite en terme de droits d'accès utilisateurs et droits d'accès de groupe.

Du coup, ce n'est pas dit que ce soit adaptable partout. Mais si c'est sur un serveur que tu gères, ça tiendra.


dimanche
22 juin 2008 à 12:10
 
 

je vois pas la différence avec un .htaccess deny from all dans toto.


dimanche
22 juin 2008 à 12:25
 
 

Voilà ce que j'ai fait pour empêcher le listage des images dans mes répertoires :

$ContenuFichierSecurite = "header(\"location: ../../index.php\") ; " ;
$ContenuFichierSecuriteThumb = "header(\"location: ../../../index.php\") ; " ;
if(!is_dir($UploadPath.$IDLastCategorie))
                    {
                        $CreationDirectory = mkdir($UploadPath.$IDLastCategorie, 0755) ;
                        $CreationDirectoryThumb = mkdir($UploadPath.$IDLastCategorie.'/thumb', 0755) ;
                        $CreationFichierSecurite = fopen($UploadPath.$IDLastCategorie.'/index.php', "x+") ;
                        $EcritureFichierSecurite = fwrite($CreationFichierSecurite, $ContenuFichierSecurite) ;
                        $FermetureFichierSecurite = fclose($CreationFichierSecurite) ;
                        $CreationFichierSecuriteThumb = fopen($UploadPath.$IDLastCategorie.'/thumb/index.php', "x+") ;
                        $EcritureFichierSecuriteThumb = fwrite($CreationFichierSecuriteThumb, $ContenuFichierSecuriteThumb) ;
                        $FermetureFichierSecuriteThumb = fclose($CreationFichierSecuriteThumb) ;
                    }


Je créés un fichier index.php (en même temps que je créés le répertoire) renvoyant automatiquement à l'accueil de mon site.


Dernière modification le 22/06/08 à 12:42 par PanPan
dimanche
22 juin 2008 à 12:39
 
 

il manque les < ? p h p devant les "header" à la ligne 1 et 2, ça fait bugger le forum si je les laisse !


dimanche
22 juin 2008 à 12:43
 
 

Akshell a écrit
je vois pas la différence avec un .htaccess deny from all dans toto.


Les .htaccess sont plus chiants à maintenir et ne peuvent pas être rattachés à une variable d'environnement du site (ce qui est normal, ça n'a jamais été prévu pour ça).


dimanche
22 juin 2008 à 14:33
 
 

chiant à maintenir ? comparé à un chmod qui peut sauter sans le savoir ?
par contre question variable il y a ce qu'il faut $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']


dimanche
22 juin 2008 à 15:00
 
 

Un chmod ne saute pas comme ça. Du moins sur un serveur qui est bien géré ; après tout dépend qui s'en occupe.

Pour les variables je ne connaissais pas ; ça peut m'être utile, je vais regarder.


dimanche
22 juin 2008 à 15:53
 
 


Répondre au sujet

Vous devez être identifié pour participer à ce topic.