Empêcher l'affichage direct de fichiers "included"

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

29 oct. 2006, 23:32

Hi, folks !

Le site sur lequel je travaille actuellement est architecturé ainsi :
  • une page principale index.php qui construit la structure générale du site
  • de nombreux fichiers PHP ou HTML appelés par index.php
    pour y être insérés au moyen de la fonction include().
index.php est finalement une page-orchestre,
une sorte d'aiguillage qui fonctionne au moyen de tests (if, switch, etc.)

Au final, la page index.php suffit à présenter le site en entier.
Je voudrais donc interdire d'afficher les fichiers PHP/HTML
autrement qu'appelés et insérés dans index.php

J'ai pensé placer tous ces fichiers dans un sous-répertoire protégé par un .htaccess.

Est-ce une solution fiable ?
Y en a-t-il d'autres ?


Et puis, un peu plus tard, je reviendrai vous demander vos lumières au sujet de l'URL rewriting... ;)

ViPHP
ViPHP | 3607 Messages

29 oct. 2006, 23:37

euh c'est peut-être pas ce que tu cherches, mais pour ce qui est des fichiers php, tu peux faire un test comme ceci en haut de chaque fichier
<?php
if($_SERVER['PHP_SELF']!='index.php'){
  //redirection vers index ou message d'erreur ou autre
}
?>

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

30 oct. 2006, 00:55

La solution du .htaccess est fiable et suffisante à mon avis. L'autre option étant de définir une constante dans ton fichier index.php et au tout début des fichiers d'inclusion de vérifier que cette constante est définie (méthode souvent utilisée par les forums).

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

30 oct. 2006, 10:09

Je ne saisis pas bien le principe de la constante... :oops:

Eléphant du PHP | 396 Messages

30 oct. 2006, 10:21

Si j'ai bien compris, tu definies une constante dans ton index et tu vérifies si la variable est definie dans toutes les pages que tu inclues.
Si elle n'est pas définie, tu n'es pas passé par l'index.

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

30 oct. 2006, 10:56

Ben regarde les sources de phpbb, punbb, joomla, etc... ils utilisent tous ce système ;)

index.php
<?php

// autoriser l'inclusion des fichiers auxiliaires
define('JE_SUIS_BIEN_DANS_MON_APPLICATION', true);

// fichiers auxiliaires
include('include.php');

?>
include.php
<?php

// vérifier que l'on est bien autorisé
defined('JE_SUIS_BIEN_DANS_MON_APPLICATION') 
    or die('Erreur ! Exécution directe interdite !');

// code principal de mon fichier auxiliaire
echo "coucou";

?>
Avantage de cette méthode : pas besoin d'un .htaccess, donc non dépendant du serveur.
Inconvénient : nécessite de modifier tous les fichiers à inclure devant être protégés.

Pour cela je n'aime pas cette méthode.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

30 oct. 2006, 12:59

En fait, c'est ce que je craignais...
Ça contraint les fichiers included à être tous en PHP
alors qu'une bonne partie des miens sont en HTML.

Les passer en PHP, rien que pour cette vérification, me paraît un peu lourd.

Je vais donc faire quelques tests sur le .htaccess.

Merci, gentlemen !

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

30 oct. 2006, 13:02

Avantage de cette méthode : pas besoin d'un .htaccess, donc non dépendant du serveur.
Sachant qu'il n'est pas bien compliqué de protéger un sous-dossier par un .htaccess,
quelle contrainte ("dépendant du serveur") cela impose-t-il ?

Mammouth du PHP | 684 Messages

30 oct. 2006, 13:05

Tout depend peut etre du serveur que tu utilise et si l'option des htaccess est bien activee.
Apres je suis sous apache, donc comme toi je pense que tous les serveurs sont bien developpes :)
Zigz4g

Mammouth du PHP | 983 Messages

30 oct. 2006, 20:44

Une autre technique consiste à mettre les fichiers inclus en dehors du document root. Donc il est impossible d'y accéder autrement que par un fichier PHP qui les inclut.

L'inconvénient est qu'il faut la main sur l'arborescence en dehors du document root du serveur web...

Sur des serveurs mutualisés, la technique du .htaccess est la plus simple et la moins contraignante.

Mammouth du PHP | 514 Messages

31 oct. 2006, 14:37

Moi je voulais protéger, en plus des fichiers php, les fichiers html.

Malheureusement, c'est pas possible via htaccess, à priori, puisque si tu mets un mot de passe, même si tu le fournis à ton index, l'utilisateur devra taper un mot de passe pour chaque fichier html inclu.

M'enfin j'ai pas exploré toutes les solutions.
Ne jamais repousser à demain ce qu'on peut faire après demain ...

Mammouth du PHP | 684 Messages

31 oct. 2006, 15:17

Pourquoi le faire avec un mot de passe ???
Pourquoi ne pas le faire avec l'ip qui serait en 127.0.0.1 ou peut etre mieux l'ip de la machine ???
Faut voir toutes les options que propose les htaccess.
Zigz4g

Invité
Invité n'ayant pas de compte PHPfrance

24 nov. 2006, 23:29

bonjour je comprend pas trop les différents développements de chacun...

il suffit de mettre tout les fichiers qui vont etre inclus dans un meme repertoire et un .htaccess comprenant

Code : Tout sélectionner

Order Deny, Allow Deny from all
ils ne pourront être affichés directement et les inclusions se feront normalement...

à moins que je n'ai pas bien saisi la question...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 nov. 2006, 23:45

Albat demandait s'il y avait une autre alternative que cette solution ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

24 nov. 2006, 23:55

Ça contraint les fichiers included à être tous en PHP
alors qu'une bonne partie des miens sont en HTML.

Les passer en PHP, rien que pour cette vérification, me paraît un peu lourd.
Attention, à partir du moment où tu charges un fichier par include() le fichier EST du PHP, peu importe son extension. Prends n'importe lequel de tes menus HTML et ajoute
<?php die('OMG'); ?>
...si tu veux le vérifier :) Donc pour les fichiers HTML utilise readfile() plutôt.

Pour le reste, je crois que tout a été dit. L'avantage de stocker les fichiers en dehors du docroot c'est qu'ils sont 100% inaccessibles, même si pour raison x Apache décidait de ne plus respecter les .htaccess