PHP:如何阻止对文件的直接URL访问,但仍然允许登录用户下载该文件?


PHP: How can I block direct URL access to a file, but still allow it to be downloaded by logged in users?

我有一个网站,用户应该能够登录和听一首歌(一个自己创建的mp3)。我想让它,所以登录的用户可以听/下载/无论什么,文件应该驻留在服务器上(不是存储在MySQL数据库),但不能由非用户谁有路径到URL访问。

例如:假设我的mp3位于mysite.com/members/song.mp3如果您已登录,您应该能够看到mysite.com/members/index.php页面,该页面将允许访问song.mp3文件。如果您没有登录,mysite.com/members/index.php页面将不会显示song.mp3文件,并且直接链接到它不应该授予访问权限。

我很确定这是通过htaccess完成的,我已经做了很多谷歌搜索,并在这里搜索。我发现的两个最接近的答案是这个htaccess指南http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/和这个StackOverflow问题块直接访问一个文件通过http,但允许php脚本访问,但没有回答我所有的问题,以满足我的标准。我错过了什么?

进入文件夹成员创建新的文件夹文件,移动这里所有的歌曲,创建新的。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

通过。htaccess你唯一能做的就是需要一个来自你网站的引用,这是不安全的。伪造一个推荐人是微不足道的,任何人都可以吸干你的网站。

ONLY的方式,你将能够只有登录的用户下载的文件是通过将文件放在你的网页外,并有一个PHP脚本调解访问。简而言之:

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

您是否使用脚本语言(如PHP)来处理您的网站?如果是这样,那么最好的方法是创建一个处理内容"交付"的脚本。将内容保存在受保护的目录中,即http或www文件夹上方。然后,当用户登录时,指向您的内容的链接看起来像这样:

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

脚本将根据id找到所需的歌曲,然后将数据呈现给用户