PHP: Comment puis-je bloquer L'accès direct à une URL à un fichier, tout en permettant qu'il soit téléchargé par les utilisateurs connectés?

j'ai un site Web où les utilisateurs devraient pouvoir se connecter et écouter une chanson (un mp3 auto-créé). Je veux faire en sorte que l'utilisateur connecté puisse écouter/télécharger/n'importe quoi, et le fichier devrait résider sur le serveur (ne pas être stocké dans la base de données MySQL), mais ne pas pouvoir être accédé par les non-utilisateurs qui ont le chemin à L'URL.

par exemple: dire que mon mp3 est situé à mysite.com/members/song.mp3 si vous êtes connecté, vous devriez être en mesure de voir mysite.com/members/index.php page, qui permettra l'accès à la chanson.fichier mp3. Si vous n'êtes pas connecté, le mysite.com/members/index.php page ne vous montrera pas la chanson.le fichier mp3, et le lien direct à celui-ci ne devrait pas accorder l'accès.

je suis presque sûr que c'est fait via htaccess, et j'ai déjà fait beaucoup de recherches sur Google, et j'ai cherché ici. Les deux réponses les plus proches que j'ai trouvées étaient ce guide htaccess http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks / et cette question StackOverflow bloque l'accès direct à un fichier sur http mais autorise l'accès au script php mais ni l'un ni l'autre ne répond à toutes mes questions pour répondre à mes critères. Ce qui me manque?

35
demandé sur Community 2011-08-20 00:39:39

3 réponses

dans le dossier membres créer un nouveau dossier fichiers , déplacer ici toutes vos chansons, Créer un nouveau .htaccess fichier et ajouter les lignes suivantes:

Order Deny,Allow
Deny from all



Dans le dossier membres créer le fichier get_song.php et ajouter le code suivant:

if( !empty( $_GET['name'] ) )
{
  // check if user is logged    
  if( is_logged() )
  {
    $song_name = preg_replace( '#[^-\w]#', '', $_GET['name'] );
    $song_file = "{$_SERVER['DOCUMENT_ROOT']}/members/files/{$song_name}.mp3";
    if( file_exists( $song_file ) )
    {
      header( 'Cache-Control: public' );
      header( 'Content-Description: File Transfer' );
      header( "Content-Disposition: attachment; filename={$song_file}" );
      header( 'Content-Type: application/mp3' );
      header( 'Content-Transfer-Encoding: binary' );
      readfile( $song_file );
      exit;
    }
  }
}
die( "ERROR: invalid song or you don't have permissions to download it." );



et maintenant, vous pouvez utiliser cette URL pour obtenir le fichier song:

http://mysite.com/members/get_song.php?name=my-song-name

56
répondu B7ackAnge7z 2011-08-19 21:45:42

la seule chose que vous pouvez faire pour cette via .htaccess est require un referer qui vient de votre site, et il n'est pas sécurisé. il est au-delà de trivial de forger un referer et n'importe qui pourrait sucer votre site sec.

Le SEULEMENT façon vous serez en mesure d'avoir seulement aux utilisateurs enregistrés de télécharger le fichier est en plaçant le fichier en DEHORS de la racine de votre site et d'avoir un script PHP médiation de l'accès. En bref:

if (is_logged_in()) {
   readfile($name_of_file);
} else {
   die("Access denied");
}
7
répondu Marc B 2011-08-19 20:44:37

utilisez-vous un langage de script tel que PHP pour gérer votre site web? si oui, alors la meilleure façon est de créer un script qui gère la "livraison" du contenu. Enregistrer le contenu dans un répertoire protégé, c'est à dire au-dessus de votre http ou dossier www. Ensuite, lorsque l'utilisateur est connecté, le lien vers votre contenu devrait ressembler à ceci:

http://yoursite.com/listen.php?song_id=xxx

le script localisera la chanson requise par le id et ensuite présenter les données à l'utilisateur

3
répondu Nick 2011-08-19 20:43:07