PHP: Как я могу заблокировать прямой URL-доступ к файлу, но разрешить его загрузку зарегистрированным пользователям? - PullRequest
35 голосов
/ 20 августа 2011

У меня есть веб-сайт, на котором пользователи должны иметь возможность войти в систему и прослушать песню (самостоятельно созданный mp3). Я хочу сделать так, чтобы вошедший в систему пользователь мог прослушивать / загружать / что угодно, и файл должен находиться на сервере (не храниться в базе данных MySQL), но не иметь доступа к тем, кто не имеет пути на URL.

Например: скажем, мой mp3 находится по адресу mysite.com/members/song.mp3. Если вы вошли в систему, вы сможете увидеть страницу mysite.com/members/index.php, которая позволит получить доступ к файл song.mp3. Если вы не вошли в систему, на странице mysite.com/members/index.php не будет отображаться файл song.mp3, а прямые ссылки на него не должны предоставлять доступ.

Я почти уверен, что это делается с помощью htaccess, и я уже много занимался поиском в Google и искал здесь. Два самых близких ответа, которые я нашел, были это руководство по htaccess http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/ и этот вопрос StackOverflow Блокировать прямой доступ к файлу через http, но разрешить доступ к php-скрипту , но ни один из них не отвечает на все мои вопросы, чтобы соответствовать моим критериям. Чего мне не хватает?

Ответы [ 3 ]

57 голосов
/ 20 августа 2011

В папку участники создать новую папку файлы , переместить сюда все ваши песни, создать новый файл .htaccess и добавить следующие строки:

Order Deny,Allow
Deny from all

В папку members создайте файл 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." );

И теперь вы можете использовать этот URL для получения файла песни:http://mysite.com/members/get_song.php?name=my-song-name

7 голосов
/ 20 августа 2011

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

ONLY способ, которым вы сможете загружать файл только вошедшим в систему пользователям, разместив файлфайл вне вашего webroot и наличие PHP-скрипта, обеспечивающего доступ.Короче говоря:

if (is_logged_in()) {
   readfile($name_of_file);
} else {
   die("Access denied");
}
3 голосов
/ 20 августа 2011

Используете ли вы язык сценариев, такой как PHP, для управления вашим сайтом?если это так, то лучший способ - создать скрипт, который обрабатывает «доставку» контента.Сохраните содержимое в защищенном каталоге, т.е. над вашей папкой http или www.Затем, когда пользователь войдет в систему, ссылка на ваш контент будет выглядеть так:

http://yoursite.com/listen.php?song_id=xxx

скрипт найдет нужную песню по идентификатору и затем представит данныепользователь

...