28 votes

PHP : Comment bloquer l'accès direct par URL à un fichier, tout en permettant son téléchargement par les utilisateurs connectés ?

J'ai un site web où les utilisateurs doivent pouvoir se connecter et écouter une chanson (un mp3 créé par eux-mêmes). Je veux faire en sorte que l'utilisateur connecté puisse écouter/télécharger/quoi que ce soit, et que le fichier réside sur le serveur (et ne soit pas stocké dans la base de données MySQL), mais qu'il ne soit pas accessible aux non-utilisateurs qui ont le chemin d'accès à l'URL.

Par exemple : disons que mon fichier mp3 se trouve à l'adresse mysite.com/members/song.mp3 Si vous êtes connecté, vous devriez pouvoir voir la page mysite.com/members/index.php, qui vous permettra d'accéder au fichier song.mp3. Si vous n'êtes pas connecté, la page mysite.com/members/index.php ne vous montrera pas le fichier song.mp3, et l'établissement d'un lien direct vers ce fichier ne devrait pas vous permettre d'y accéder.

Je suis presque sûr que cela se fait via htaccess, et j'ai déjà fait beaucoup de recherches sur Google et sur ce site. Les deux réponses les plus proches que j'ai trouvées sont ce guide htaccess http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/ et cette question StackOverflow Bloquer l'accès direct à un fichier par http mais autoriser l'accès à php script. mais aucun ne répond à toutes mes questions pour répondre à mes critères. Que me manque-t-il ?

41voto

B7ackAnge7z Points 1433

Dans le dossier membres créer un nouveau dossier fichiers déplacer ici toutes vos chansons, créer de nouvelles .htaccess et ajoutez les lignes suivantes :

Order Deny,Allow
Deny from all

Dans le dossier membres créer un fichier get_song.php et ajoutez 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 de la chanson :
http://mysite.com/members/get\_song.php?name=my-song-name

6voto

Marc B Points 195501

La seule chose que vous pouvez faire pour cela via .htaccess est d'exiger un référent qui provient de votre site, et ce n'est PAS sécurisé. Il est plus que trivial de falsifier un référent et n'importe qui pourrait assécher votre site.

El UNIQUEMENT La façon dont vous pourrez faire en sorte que seuls les utilisateurs connectés téléchargent le fichier est de placer le fichier EN DEHORS de votre webroot et d'avoir un script PHP qui gère l'accès. En bref :

if (is_logged_in()) {
   readfile($name_of_file);
} else {
   die("Access denied");
}

3voto

Nick Points 455

Utilisez-vous un langage de script tel que PHP pour gérer votre site Web ? Si c'est le cas, le meilleur moyen est de créer un script qui gère la "livraison" du contenu. Enregistrez le contenu dans un répertoire protégé, c'est-à-dire au-dessus de votre dossier http ou www. Ensuite, lorsque l'utilisateur est connecté, le lien vers votre contenu ressemble à ceci :

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X