PHP: как я могу заблокировать прямой доступ к URL-адресу для файла, но все-таки разрешить его загрузку вошедшим в систему пользователям?
У меня есть веб-сайт, где пользователи должны иметь возможность войти в систему и прослушать песню (созданный самостоятельно mp3). Я хочу сделать так, чтобы зарегистрированный пользователь мог прослушивать/скачивать/независимо, а файл должен находиться на сервере (не храниться в базе данных MySQL), но не может быть доступен не-пользователям, у которых есть путь к URL.
Например: скажем, мой mp3 находится на mysite.com/members/song.mp3. Если вы вошли в систему, вы сможете увидеть страницу mysite.com/members/index.php, которая позволит получить доступ к файл song.mp3. Если вы не вошли в систему, страница mysite.com/members/index.php не покажет вам файл song.mp3, и ссылка на него не должна предоставлять доступ.
Я уверен, что это делается через htaccess, и я уже много сделал для Googling и искал здесь. Два ближайших ответа, которые я нашел, были в этом руководстве htaccess http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/ и этот вопрос StackOverflow Блокировать прямой доступ в файл через http, но разрешить доступ к PHP скрипт, но не отвечайте на все мои вопросы, чтобы соответствовать моим критериям. Что мне не хватает?
Ответы
Ответ 1
В члены папки создайте новые файлы папок, переместите сюда все свои песни, создайте новый файл .htaccess и добавьте следующие строки:
Order Deny,Allow
Deny from all
В члены папки создайте файл 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
Ответ 2
Единственное, что вы можете сделать для этого через .htaccess, - это реферирование, которое приходит с вашего сайта, и оно НЕ безопасно. это не так просто, чтобы подделать референта, и любой может сосать ваш сайт сухим.
ТОЛЬКО вы можете иметь только зарегистрированные пользователи, загружающие файл, путем размещения файла OUTSIDE вашего веб-сайта и получения посреднического доступа PHP script. Короче говоря:
if (is_logged_in()) {
readfile($name_of_file);
} else {
die("Access denied");
}
Ответ 3
Используете ли вы язык сценариев, например PHP, для обработки вашего сайта? если это так, лучший способ - создать script, который обрабатывает "доставку" содержимого. Сохраните содержимое в защищенном каталоге, то есть над вашей папкой http или www. Затем, когда пользователь войдет в систему, ссылка на ваш контент будет выглядеть следующим образом:
http://yoursite.com/listen.php?song_id=xxx
script найдет нужную песню по идентификатору, а затем представит данные пользователю