Proteger des fichiers selon la session en cour

Eléphanteau du PHP | 27 Messages

11 avr. 2011, 11:30

Bonjour, j'aimerai savoir si il m'était possible de proteger mes fichiers (pour que, le fichier ne soit pas disponible si l'utilisateur entre le lien absolu du fichier) en fonction de la session php en cour.
Par exemple : si la session est strictement égale à nom_de_la_session alors l'accée au dossier et au fichier du dossier est autorisé sinon marquer 'error'.
Voila si quelqu'un à une idée ou solution qui pourrais m'aider je lui en serait entierement reconnaissant ;)

Merci

Mammouth du PHP | 672 Messages

11 avr. 2011, 11:50

Bonjour.

Pour vérifier si le script est accédé directement, à mettre au début du script à "protéger" :
if (realpath($_SERVER["SCRIPT_FILENAME"]) == __FILE__) {
	die ('erreur');
}
__FILE__ => Le chemin complet et le nom du fichier courant. Si utilisé pour une inclusion, le nom du fichier inclus est retourné.
realpath($_SERVER["SCRIPT_FILENAME"] => Le chemin absolu vers le fichier contenant le script en cours d'exécution (celui qui fait le include(), si include).

Du coup, si tu appelles un script via une autre page, les deux diffèrent. Si tu appelles directement le script, les deux sopnt égaux => sortie.

Eléphanteau du PHP | 27 Messages

11 avr. 2011, 12:12

J'ai du mal a comprendre, ou il faut placer ce script, dans quel page?

ViPHP
xTG
ViPHP | 7331 Messages

11 avr. 2011, 12:53

C'est un script PHP que tu veux protéger ou bien des fichiers autres (images, zip, ect) ?

Mammouth du PHP | 672 Messages

11 avr. 2011, 12:54

Ben au début de la page à protéger...
Attention, tel qu'il est il bloque l'accès à tout le monde, il faut rajouter un test sur la session (si c'est ce que tu veux utiliser).

Sinon, il y a une solution efficace : htaccess.

Eléphanteau du PHP | 27 Messages

11 avr. 2011, 15:30

Les fichiers à protéger sont dans des formats divers (pas seulement des scripts php) et le htaccess ne me convient pas vraiment au niveau du visuel et je n'ai rien trouver qui permet de modifier le visuel sur le web.

:::J'aimerai en fait faire comme un htaccess mais au lieu d'accéder au dossier si le mot de passe est bon je veut qu'il y accede si la session est bonne:::


ps:Pour la protection d'une page php selon session j'avais déja fais un script.

Merci

ViPHP
AB
ViPHP | 5818 Messages

11 avr. 2011, 16:22

Alors il faut mettre tes fichiers (à protéger) dans un répertoire protégé par un .htaccess avec la mention :
deny from all
Ensuite tu pourras faire lire (ou télécharger) ces fichiers par php si la session est bonne.

Eléphanteau du PHP | 27 Messages

13 avr. 2011, 16:10

Merci pour vos reponses

Eléphanteau du PHP | 27 Messages

14 avr. 2011, 12:55

Je suis désoler de ne pas en avoir fini avec ce sujet ^^ mais j'aimerai maintenant (sachant que je suis vraiment nul en language htaccess :/) connaitre les codes à faire à la maniere dont AB a dit . j'ai essayé sa methode mais je ne vois pas du tous quoi mettre à part deny from all dans mon htaccess :oops:

Donc moi je veut juste (pour le rappeler) autorisé l'accée a des fichiers sauf si une session est active.

Il faudrai traduire <?php if ($_SESSION['admin'] == "ma_session") ?> mais en language htaccess.

Merci

ViPHP
AB
ViPHP | 5818 Messages

14 avr. 2011, 15:06

Tu n'as rien d'autre à mettre dans ton .htaccess que : deny from all.

Aucun lien ne pourra lire directement un fichier dans ce dossier.
Par contre php pourra y avoir accès, donc il faut lire les fichiers avec php et c'est dans ta page php que tu mets ta condition <?php if ($_SESSION['admin'] == "ma_session") ?>

Par exemple :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>

<body>
<div>
<img src="read_img.php?img=photo1.jpg" />
<img src="read_img.php?img=photo2.jpg" />
</div>
</body>
</html>
Le script ci-dessus fait donc appel à la page "read_img.php" pour afficher les images.

Contenu de read_img.php :
<?php 
if ($_SESSION['admin'] == "ma_session") 
{
$img = isset($_GET['img'])? $_GET['img'] :'';

$dossier_protege = 'mon_repertoire_protege/';

$adresse_fichier = $dossier_protege.$img;

$adresse_fichier  = strpos($adresse_fichier,'./') !== false ? $adresse_fichier :''; // pour éviter la navigation entre les répertoires

if(is_file($adresse_fichier)) // vérifie que le fichier existe
{
header("Content-Type: image/jpeg");

readfile("$adresse_fichier");
}
}
?>
Modifié en dernier par AB le 14 avr. 2011, 23:16, modifié 1 fois.

Eléphanteau du PHP | 27 Messages

14 avr. 2011, 16:10

Merci beaucoup je teste sa et vois si sa marche

ViPHP
AB
ViPHP | 5818 Messages

14 avr. 2011, 23:18

Y'avait une erreur sur la dernière ligne (readfile("$img");) que j'ai corrigé par readfile("$adresse_fichier"); dans mon post :wink: