8791 sujets

Développement web côté serveur, CMS

Bonsoir,
se posait à moi la question d'empêcher l'accès à des fichiers dont le contenu est destiné exclusivement à être inclus par d'autres fichiers, j'ai écris une fonction qui semble permettre ceci, j'aimerais savoir si vous approuvez son efficacité et surtout sa sécurité:
<?php
	function ver_include($file) {
		if(basename($file)==basename($_SERVER['PHP_SELF'])) {
			echo 'Erreur: l\'accès à ce fichier n\'est pas autorisé.';
			exit;
		}
	}
?>
Ensuite, pour vérifier si un fichier est inclus ou pas, j'insère la fonction au début du fichier que je veux tester avec la constante "__FILE__" pour règle "$file"
ver_include(__FILE__);
Alors est-ce que c'est bon ? Merci à vous
Modifié par xXjujo002Xx (15 Jan 2013 - 22:18)
Perso, je fonctionne comme ceci :

Fichier index.php :
define('MA_CONSTANTE', TRUE);

Fichiers "include" :
if (!defined('MA_CONSTANTE'))
{
    header('Location: index.php');
    exit;
}

tm
Je préfèrerais plutôt ma fonction (ça se résume en une ligne et ce ne nécessite pas la déclaration de variables ou de constantes), mais y a t-il pense-tu un moyen de la détourner ? Je veux être sûr que ça soit suffisamment sécurisé Smiley sweatdrop
La solution proposée par TM est plus performante que ta fonction, l'utilisation d'une constante est clairement le bon choix.

De plus, ca te permet de gérer plusieurs source différentes suivant la valeur de la constante avec un simple switch donc pour l'évolution c'est bon.

Niveau sécurité ... la constante ne peut être transmise qu'en "local"
Il y a au moins un bug subtil - ta fonction ne compare que les noms de fichiers, pas les chemins. Donc si un script du genre /script.php (autorisé en accès direct) appelle un include d'un script /subdir/script.php (protégé par ta fonction), il y a bug... L'include sera erronément interdit par ta fonction.

La meilleure solution pour éviter toute ligne de code est de mettre tous les scripts inclus dans un sous-répertoire et d'interdire l'accès direct aux scripts de ce sous-répertoire en y introduisant un fichier .htaccess contenant la ligne :
deny from all