Разрешить проигрывание mp3 файлов на сайте, но запретить скачивание по прямой ссылке - PullRequest
1 голос
/ 30 мая 2019

У меня есть проект codeigniter для воспроизведения и загрузки mp3-файлов. Пользователи и администраторы могут воспроизводить mp3-файлы из внешнего интерфейса и внутреннего интерфейса, но пользователи не должны иметь возможность загружать эти файлы, кроме как из контроллера загрузки с помощью помощника по загрузке. Это то, что я сделал до сих пор, я добавил файл htaccess в звуковую директорию, чтобы предотвратить прямую загрузку, и это работает, но это вообще не позволяет пользователям воспроизводить mp3-файлы.

<FilesMatch "\.(mp3)$">
Order allow,deny
Deny from all
</FilesMatch>

И контроллер загрузки работает нормально, позволяя определенным пользователям загружать эти файлы. Как отредактировать его, чтобы разрешить воспроизведение mp3 файлов в этом каталоге без прямого доступа к полному пути загрузки?

Я хочу получить доступ к файлам mp3 с определенных страниц, чтобы воспроизвести его, загрузить и запретить любой другой прямой доступ к нему.

Обратите внимание, что аудио элемент в проекте использует абсолютный путь к mp3-файлу для его воспроизведения. Я даже пытался использовать относительный путь к нему, но не играл слишком

1 Ответ

0 голосов
/ 30 мая 2019

Вот идея

Использовать 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, мы хотим, чтобы клиент не шел по этому маршруту вручную и не получал токен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...