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

Bin*_*ing 37 php .htaccess access-control hotlinking

我有一个网站,用户应该可以登录并听一首歌(一个自创的mp3).我想这样做,以便登录用户可以监听/下载/无论如何,该文件应驻留在服务器上(不存储在MySQL数据库中),但不能被具有该路径的非用户访问到URL.

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

我很确定这是通过htaccess完成的,我已经做了很多谷歌搜索,并在这里搜索.我找到的两个最接近的答案是这个htaccess指南http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/和这个StackOverflow问题阻止通过http直接访问文件但允许php脚本访问但是既不回答我的所有问题也不符合我的标准.我错过了什么?

Vic*_*tor 58

进入文件夹成员创建新文件夹文件,在此处移动所有歌曲,创建新的.htaccess文件并添加以下行:

Order Deny,Allow
Deny from all
Run Code Online (Sandbox Code Playgroud)


在文件夹成员中创建文件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." );
Run Code Online (Sandbox Code Playgroud)


现在,您可以使用此URL获取歌曲文件:http://mysite.com/members/get_song.php?name = my- song-
name

  • 您可以将文件存储在wwwroot之外,而不是拒绝直接访问. (4认同)

Mar*_*c B 7

你可以通过.htaccess做的唯一事情就是需要一个来自你网站的引用者,这是不安全的.建立一个引用者并不是微不足道的,任何人都可以把你的网站吸干.

只有登录用户才能下载文件的唯一方法是将webroot的文件放在OUTSIDE中并使用PHP脚本调解访问权限.简而言之:

if (is_logged_in()) {
   readfile($name_of_file);
} else {
   die("Access denied");
}
Run Code Online (Sandbox Code Playgroud)

  • 不会说它是"唯一的东西" (7认同)