2017-06-11 3 views
1

Mon script PHP créer un répertoire de l'utilisateur pour stocker des fichiers privés et je dois le garder privé, sauf pour le propriétaire..htaccess protéger télécharger les fichiers privés du répertoire de l'utilisateur en utilisant php

Fondamentalement, ma structure est comme ceci:

- root/ 
- storage/ 
---- users/ 
----------user1/ 
---------------.htaccess 
---------------images/ 
---------------tmp/ 
-------------------session-id-file 
----------user2/ 
---------------.htaccess 
---------------images/ 
---------------tmp/ 
-------------------session-id-file 

Cela signifie que lorsque un nouveau registre d'utilisateur, le répertoire d'un nouvel utilisateur est créé dans/stockage/utilisateurs:

$dir = __DIR__ . "/storage/user/" . $user["id"]; mkdir($dir);

Ensuite, une nouvelle .htaccess est créé à l'intérieur:

$myfile = fopen($file, "w") or die("Unable to create file!"); 
$txt = "RewriteCond %{HTTP_COOKIE}  PHPSESSID=(\w+)\n 
**RewriteCond {CURRENT-DIRECTORY}/tmp/access-%1  -f \n** 
RewriteRule ^(.+)$ $1 [L]\n 
RewriteRule .+ /deny [L]\n"; 
fwrite($myfile, $txt); 
fclose($myfile); 

La .htacce ss apparaît comme:

RewriteCond %{HTTP_COOKIE}  PHPSESSID=(\w+) 
RewriteCond {CURRENT-DIRECTORY}/tmp/access-%1  -f 
RewriteRule ^(.+)$ $1 [L] 

RewriteRule .+ /deny [L] 

Lorsque l'utilisateur connexion d'un nouveau fichier de session-id est crerated dans le répertoire tmp de l'utilisateur:

touch($dir . "/tmp/" . session_id());

Ma question est la suivante: comment détecter {répertoire courant} où le htaccess est situé ? Fondamentalement comment corriger la mauvaise ligne .htaccess:

 RewriteCond {CURRENT-DIRECTORYY}}/tmp/access-%1  -f \n 

J'ai vu la même question, mais je ne suis pas en mesure de détecter le répertoire courant basé sur le répertoire créé à la volée.

Une bonne option pourrait être d'utiliser un seul fichier .htaccess dans le répertoire/users au lieu de beaucoup de .htaccess pour chaque utilisateur comme je l'ai fait dans mon exemple.

Merci pour toute suggestion :)

+0

Voulez-vous refuser tout accès/stockage/utilisateurs? Est-ce que je le comprends bien? – thhan

+0

Oui. Sauf pour le propriétaire. Je détecte le propriétaire en utilisant le fichier session_id et le cookie. – Uncoke

Répondre

1

D'abord, vous pouvez changer:

RewriteRule ^(.+)$ $1 [L] 

Pour:

RewriteRule^- [L] 

Ce qui signifie la même chose. - peut être utilisé pour dire ne pas faire de changement, il suffit d'appliquer les drapeaux. Pour refuser, vous pouvez le faire correctement en utilisant l'indicateur [F] pour renvoyer un 403 interdit, au lieu d'un 200 réécrire à /deny. Comme si:

RewriteRule^- [F,L] 

Si vous voulez toujours le contenu de /deny à retourner puis ajouter une directive ErrorDocument pour 403 et pointer vers cette page.

Pour écrire dans un fichier en PHP, vous pouvez simplement utiliser file_put_contents au lieu de ces trois appels à fopen, fwrite et fclose. Voir the documentation.

Pour répondre à votre question actuelle, pour le répertoire actuel, vous ne pouvez pas l'obtenir directement à partir des variables RewriteCond, mais vous pouvez simplement l'écrire dans le fichier lorsque vous le générez avec PHP.

Voici un exemple de cela avec les autres modifications proposées:

$txt = "RewriteCond %{HTTP_COOKIE} PHPSESSID=(\w+)\n 
RewriteCond $dir/tmp/access-%1 -f\n 
RewriteRule^- [L]\n 
RewriteRule^- [F,L]\n"; 
file_put_contents($myfile, $txt) or die("Unable to create file!"); 

Ainsi, il devient, par exemple:

RewriteCond %{HTTP_COOKIE} PHPSESSID=(\w+) 
RewriteCond /root/storage/users/userid/tmp/access-%1 -f 
RewriteRule^- [L] 
RewriteRule^- [F,L] 
+0

Merci! Bon point! J'ai une autre erreur parce que la condition: RewriteCond/httpdocs/stockage/utilisateur/1/tmp/access-% 1 -f n'est pas vrai, mais le fichier existe. Hmmm j'ai vérifié et la valeur% 1 est correcte (et le fichier de session existe dans le chemin). – Uncoke

+0

Peut-être vérifier deux fois ce chemin? C'est différent de la structure de chemin que vous avez spécifiée ci-dessus, peut-être que vous avez une erreur dans le chemin. '/ user/1' au lieu de'/users/user1'. – SuperDuperApps

+1

Sinon, assurez-vous qu'Apache a accès au chemin, et regardez paramétrer 'LogLevel rewrite: trace3' (ou un niveau supérieur de trace jusqu'à 8) dans votre configuration Apache principale pour voir ce qui ne va pas avec les règles. – SuperDuperApps