Php 允许在网站中播放mp3文件,但禁止从直接链接下载

Php 允许在网站中播放mp3文件,但禁止从直接链接下载,php,.htaccess,codeigniter,Php,.htaccess,Codeigniter,我有一个用于播放和下载mp3文件的codeigniter项目。用户和管理员可以从前端和后端播放mp3文件,但除了使用下载助手从下载控制器下载这些文件外,用户不应能够从下载控制器下载这些文件。这就是我到目前为止所做的,我在声音目录中添加了htaccess文件,以防止直接下载,它可以工作,但可以阻止用户播放mp3文件 <FilesMatch "\.(mp3)$"> Order allow,deny Deny from all </FilesMatch> 下载控制器工作正常,

我有一个用于播放和下载mp3文件的codeigniter项目。用户和管理员可以从前端和后端播放mp3文件,但除了使用下载助手从下载控制器下载这些文件外,用户不应能够从下载控制器下载这些文件。这就是我到目前为止所做的,我在声音目录中添加了htaccess文件,以防止直接下载,它可以工作,但可以阻止用户播放mp3文件

<FilesMatch "\.(mp3)$">
Order allow,deny
Deny from all
</FilesMatch>
下载控制器工作正常,允许特定用户下载这些文件。如何编辑它以允许在该目录中播放mp3文件而不直接访问完整下载路径

我想从特定页面访问mp3文件来播放和下载它,并拒绝任何其他直接访问

请不要担心项目中的音频元素使用mp3文件的绝对路径来播放它。我甚至尝试过使用相对路径,但没有玩太多

使用PHP文件作为MP3

我知道这听起来很奇怪,但从技术上讲,PHP文件可以解释为任何文件类型

您的前端:

<audio controls>
  <source src="music.php?token=as5df65s1df" type="audio/mpeg">
</audio>
这样做的目的如下: 当用户访问页面点击play时,它会工作,因为使用了令牌 当用户访问音频src页面时,未设置get令牌,访问被拒绝 当用户访问audiosrc页面时,get已经在初始加载时加载,因此它已过期 如果有人使用inspect查看src文件,并右键单击并保存源,则表示令牌已被使用,访问被拒绝

这不是一个防弹系统,但对一个普通的网站来说是非常好的

如果是有效的播放,php文件将显示为mp3文件 如果它不是有效的播放,则显示为php文件,访问被拒绝

您还需要将mp3文件放在公用文件夹之外,这样只有php文件读取器才能访问它们。客户端将永远看不到.mp3文件,如果您决定将mp3文件放在公共视图中,他们将不得不猜测查看它的路径

我的建议是使用jsaudioapi,每次你想播放一首歌时,创建一个新的音频对象,并通过AJAX获得一个新的令牌

注意:在获取新令牌时,请使用POST或get以外的任何方式,我们希望避免客户端手动转到该路由并获取令牌

使用PHP文件作为MP3

我知道这听起来很奇怪,但从技术上讲,PHP文件可以解释为任何文件类型

您的前端:

<audio controls>
  <source src="music.php?token=as5df65s1df" type="audio/mpeg">
</audio>
这样做的目的如下: 当用户访问页面点击play时,它会工作,因为使用了令牌 当用户访问音频src页面时,未设置get令牌,访问被拒绝 当用户访问audiosrc页面时,get已经在初始加载时加载,因此它已过期 如果有人使用inspect查看src文件,并右键单击并保存源,则表示令牌已被使用,访问被拒绝

这不是一个防弹系统,但对一个普通的网站来说是非常好的

如果是有效的播放,php文件将显示为mp3文件 如果它不是有效的播放,则显示为php文件,访问被拒绝

您还需要将mp3文件放在公用文件夹之外,这样只有php文件读取器才能访问它们。客户端将永远看不到.mp3文件,如果您决定将mp3文件放在公共视图中,他们将不得不猜测查看它的路径

我的建议是使用jsaudioapi,每次你想播放一首歌时,创建一个新的音频对象,并通过AJAX获得一个新的令牌


注意:在获取新令牌时,请使用POST或除get以外的任何方法,我们希望避免客户端手动转到该路径,并且获取令牌

soundcloud将使用文件特有的密钥通过api获取文件块。这会阻止直接访问该文件。您可以想象,对于q&a站点来说,imo的任何解决方案都过于宽泛。SoundCloud将使用文件特有的密钥通过api获取文件。这会阻止直接访问该文件。你可以想象,imo的任何解决方案对于问答网站来说都太广泛了
if(!isset($_GET['token'])){
  //No token? They tried to view the file
  die('access denied');
}


if($_GET['token'] == $_SESSION['securePlay']){
// The one time token hasn't been used yet
// Go ahead and mimic an MP3 and play the music

  $file = 'realMusic.mp3';

  if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
  }

  //Here is where you'll want to invalidate the current token and get a new one

} else {
  //The tokens don't match meaning you got a new one and the old one cant be used anymore
  die('access denied');
}