Вот идея
Использовать PHP-файл в качестве MP3 ...
Я знаю, это звучит странно, но технически файл PHP можно интерпретировать как ЛЮБОЙ тип файла
Ваш интерфейс:
<audio controls>
<source src="music.php?token=as5df65s1df" type="audio/mpeg">
</audio>
Позвольте мне объяснить это:
Когда пользователь заходит на страницу, установите токен доступа, который можно использовать только один раз, установите его на src и установите в сеансе
$_SESSION['securePlay'] = 'as5df65s1df';
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');
}
Это делает следующее:
Когда пользователь посещает страницу, нажимает кнопку воспроизведения, она работает, потому что используется токен
Когда пользователь заходит на страницу аудио src, токен get не установлен, доступ запрещен
Когда пользователь заходит на страницу аудио src, get уже загружен при начальной загрузке, поэтому срок его действия истек
Если кто-то использует inspect для просмотра файла src, щелкнув правой кнопкой мыши и сохрани источник, токен уже используется, доступ запрещен
Это НЕ пуленепробиваемая система, но чертовски хорошо для среднего сайта
Если это допустимое воспроизведение, php-файл будет отображаться как mp3-файл.
Если это не правильное воспроизведение, оно отображается как файл php, и доступ запрещен
Вы также захотите поместить mp3-файлы вне общедоступной папки, чтобы только читатель php-файла мог получить к ним доступ. Клиент никогда не увидит файл .mp3, и если вы решите разместить mp3-файлы в открытом доступе, им придется угадать путь для их просмотра.
Я рекомендую использовать JS Audio API, и каждый раз, когда вы хотите воспроизвести песню, создайте новый аудиообъект и получите новый токен через AJAX
Примечание: при получении нового токена, использовании POST или чего-либо другого, кроме get, мы хотим, чтобы клиент не шел по этому маршруту вручную и не получал токен