web-dev-qa-db-ja.com

PHP:どうすればファイルへの直接URLアクセスをブロックできますが、ログインしたユーザーによるダウンロードを許可できますか?

ユーザーがログインして歌を聴くことができるウェブサイトがあります(自分で作成したmp3)。ログインしたユーザーがリッスン/ダウンロード/何でもできるようにし、ファイルはサーバーに存在する必要がありますが(MySQLデータベースに保存されません)、パスを持つ非ユーザーがアクセスできないようにしますURLへ。

たとえば、私のmp3がmysite.com/members/song.mp3にあるとします。ログインしている場合、mysite.com/members/index.phpページが表示され、曲へのアクセスが許可されます。 mp3ファイル。ログインしていない場合、mysite.com/members/index.phpページにはsong.mp3ファイルが表示されないため、このファイルに直接リンクしてもアクセスは許可されません。

これはhtaccessを介して行われると確信しており、既に多くのグーグル検索を行っており、ここで検索しました。私が見つけた2つの最も近い答えは、このhtaccessガイド http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/ とこのStackOverflowの質問 ブロックへの直接アクセスhttp経由でファイルに送信しますが、phpスクリプトへのアクセスは許可します が、基準を満たすためにすべての質問に答えない。私は何が欠けていますか?

35
Bing

フォルダーにmembers新しいフォルダーを作成files、ここにすべての曲を移動し、新しい。htaccessファイルを作成して、次の行を追加します。

Order Deny,Allow
Deny from all


フォルダへメンバーファイルの作成 get_song.php 次のコードを追加します。

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." );


これで、このURLを使用して曲ファイルを取得できます。
http://mysite.com/members/get_song.php?name=my-song-name

57
Victor

.htaccessを介してこのためにできることは、サイトからのリファラーが必要なことだけであり、安全ではありません。リファラーを偽造するのは簡単なことではなく、誰でもサイトを乾燥させることができます。

[〜#〜] only [〜#〜]ログインしたユーザーのみがファイルをダウンロードできるようにするには、webrootの外側にファイルを配置し、PHPスクリプトはアクセスを仲介します。要するに:

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

PHPなどのスクリプト言語を使用してWebサイトを処理しますか?その場合、コンテンツの「配信」を処理するスクリプトを作成することが最善の方法です。コンテンツを保護されたディレクトリに保存します、つまり、httpまたはwwwフォルダの上にある場合、ユーザーがログインすると、コンテンツへのリンクは次のようになります。

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

スクリプトはIDによって必要な曲を見つけ、ユーザーにデータを提示します

3
Nick