rewriterule mod_rewrite htaccess example php .htaccess access-control hotlinking

mod_rewrite - PHP: ¿Cómo puedo bloquear el acceso directo de URL a un archivo, pero aún así permitir que los usuarios que inician sesión lo descarguen?



on htaccess (3)

Tengo un sitio web donde los usuarios deberían poder iniciar sesión y escuchar una canción (un mp3 creado por ellos mismos). Quiero hacerlo para que el usuario conectado pueda escuchar / descargar / lo que sea, y el archivo debe residir en el servidor (no se debe almacenar en la base de datos MySQL), pero no ser accesible para los no usuarios que tienen la ruta a la URL

Por ejemplo: diga que mi mp3 se encuentra en mysite.com/members/song.mp3. Si ha iniciado sesión, debería poder ver la página mysite.com/members/index.php, que le permitirá acceder a la canción. archivo mp3. Si no ha iniciado sesión, la página mysite.com/members/index.php no le mostrará el archivo song.mp3, y la vinculación directa a este no debe otorgar acceso.

Estoy bastante seguro de que esto se hace a través de htaccess, y ya he hecho muchas búsquedas en Google y busqué aquí. Las dos respuestas más cercanas que encontré fueron esta guía de htaccess http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/ y esta pregunta de StackOverflow Bloquea el acceso directo a un archivo a través de http, pero permite el acceso de script php pero ninguno responde todas mis preguntas para cumplir mis criterios. ¿Qué me estoy perdiendo?


¿Estás usando un lenguaje de scripting como PHP para manejar tu sitio web? Si es así, la mejor manera es crear un script que maneje la "entrega" del contenido. Guarde el contenido en un directorio protegido, es decir, encima de su carpeta http o www. Luego, cuando el usuario inicie sesión, el enlace a su contenido se verá así:

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

el script localizará la canción requerida por el id y luego presentará los datos al usuario


En la carpeta, los miembros crean nuevos archivos de carpeta, mueven aquí todas sus canciones, crean un nuevo archivo .htaccess y agregan las siguientes líneas:

Order Deny,Allow Deny from all


En la carpeta, los miembros crean el archivo get_song.php y agregan el siguiente código:

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." );


Y ahora, puedes usar esta URL para obtener el archivo de la canción:
http://mysite.com/members/get_song.php?name=my-song-name


Lo único que puede hacer para esto a través de .htaccess es requerir un referer que proviene de su sitio, y NO es seguro. es más que trivial forjar un referer y cualquiera puede chupar su sitio.

La ÚNICA manera en que podrá tener solo usuarios que hayan iniciado sesión para descargar el archivo es colocando el archivo FUERA de su webroot y teniendo un acceso de mediación de script PHP. En breve:

if (is_logged_in()) { readfile($name_of_file); } else { die("Access denied"); }