Comment protéger les fichiers téléchargeables dans un répertoire distant des utilisateurs non-premium (en php?)

StackOverflow https://stackoverflow.com/questions/1550071

Question

Im la construction d'une section « premium » de mon site et je suis dans un besoin de donner accès au téléchargement de fichiers dans un directement à distance (sur un autre serveur), aux utilisateurs avec des privilèges spéciaux (comptes stockés dans une base MySQL db). Mon site est codé en php / mysql donc une solution php serait génial.

Était-ce utile?

La solution

diriger tous les liens de téléchargement vers un fichier php qui va faire toutes les vérifications des titres de compétences.

vous pouvez appeler le fichier download.php

transmettre les paramètres via les cookies, obtenir, après, session, ou tout autre manière que vous vérifier les privilèges.

une fois les informations d'identification sont vérifiées

, vous pouvez envoyer un en-tête approprié.

si elle est une image, l'en-tête serait header("Content-type: image/jpeg");

Je suppose que vous possédez également ce serveur distant.

quelques liens utiles:

types MIME

PHP en-tête Fonction

Autres conseils

Comme @pxl dit, vous devez vérifier l'autorisation et sortie le type MIME correct comme un en-tête HTML (comme il a dit: header("Content-type: image/jpeg");)

En outre, une fois que vous avez fini avec cela, vous aurez besoin de sortir le contenu réel du fichier et sa taille (en octets) en tant que tels:

header("Content-Length: ".filesize("FILENAME")*1.001);
/* The *1.001 puts a nice buffer on the filesize, I read about it online.
Browsers will stop downloading exactly at the Content-Length, but if they go
over, it's not a big deal at all. */
readfile("FILENAME");
die();

Assurez-vous de stocker le fichier dans un répertoire qui n'est pas accessible depuis le web.

Je suis habitué à le faire dans ASP.NET où il est construit, mais ce article semble chronique votre situation exacte.

Voici ce que je ferais:

  1. Construction d'un PHP-SOAP-Sever sur le serveur distant B qui contient les fichiers.

  2. Chaque fois qu'un utilisateur déclenche un téléchargement sur votre serveur principal A connecter au SOAP Server sur B et réserver un billet pour l'utilisateur en spécifiant une adresse IP et l'ID / chemin du fichier à télécharger.

  3. Le serveur B va maintenant créer un TicketID (qui ne devrait être valable pour une durée limitée) pour le téléchargement et le retourner à A.

  4. Un serveur redirige l'utilisateur vers le serveur B fournissant le TicketID en tant que paramètre GET

  5. Le serveur B vérifie maintenant si le billet était déjà utilisé, est arrivé à expiration ou si l'utilisateur vient de la mauvaise IP. Si aucun d'entre eux appliquent servent le dossier et marquer le billet tel qu'il est utilisé.

Remarque: Sur le serveur B ne tient pas en cours d'exécution PHP tout en servant le fichier, mais utiliser le en-tête X-Sendfile à la place. Sinon, le téléchargement peut arrêter après le temps d'exécution PHP max.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top