web-dev-qa-db-fra.com

PHP: Comment puis-je bloquer l'accès URL direct à 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/quoi que ce soit, et le fichier doit résider sur le serveur (ne pas être stocké dans la base de données MySQL), mais ne pas être accessible aux non-utilisateurs qui ont le chemin à l'URL.

Par exemple: disons que mon mp3 se trouve sur mysite.com/members/song.mp3 Si vous êtes connecté, vous devriez pouvoir voir la page mysite.com/members/index.php, qui permettra d'accéder à la chanson. fichier mp3. Si vous n'êtes pas connecté, la page mysite.com/members/index.php ne vous montrera pas le fichier song.mp3, et un lien direct vers celui-ci ne devrait pas autoriser l'accès.

Je suis presque sûr que cela se fait via htaccess, et j'ai déjà fait beaucoup de recherches sur Google et 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 Bloquer l'accès direct à un fichier via http mais autoriser l'accès au script php mais ni répondre à toutes mes questions pour répondre à mes critères. Qu'est-ce que je rate?

35
Bing

Dans le dossier membres créez un nouveau dossier fichiers, déplacez ici toutes vos chansons, créez un nouveau fichier . 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

57
Victor

La seule chose que vous pouvez faire pour cela via .htaccess est de demander un référent provenant de votre site, et ce n'est PAS sécurisé. il est plus que trivial de forger un référent et n'importe qui pourrait aspirer votre site à sec.

SEULEMENT vous ne pourrez avoir que les utilisateurs connectés pour télécharger le fichier en plaçant le fichier À L'EXTÉRIEUR de votre racine Web et en ayant un PHP script mediate access. En bref:

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

Utilisez-vous un langage de script tel que PHP pour gérer votre site Web? Dans l'affirmative, la meilleure façon 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 devrait ressembler à ceci:

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

le script localisera la chanson requise par l'identifiant, puis présentera les données à l'utilisateur

3
Nick