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