Foros del Web » Programando para Internet » PHP »

Restringir descarga de archivos

Estas en el tema de Restringir descarga de archivos en el foro de PHP en Foros del Web. Saludos comunidad, tengo la siguiente duda: 1.- Estoy realizando un sistema, en el cual despues de autenticarse la persona, puede ingresar a contenido descargable (archivos), ...
  #1 (permalink)  
Antiguo 27/07/2013, 12:09
Avatar de skyz  
Fecha de Ingreso: abril-2010
Mensajes: 170
Antigüedad: 14 años
Puntos: 1
Exclamación Restringir descarga de archivos

Saludos comunidad, tengo la siguiente duda:

1.- Estoy realizando un sistema, en el cual despues de autenticarse la persona, puede ingresar a contenido descargable (archivos), hasta que no se halla eliminado al usuario desde la base de datos.
2.- Si la persona no es autenticada pues no puede ingresar al sistema, pero hay una falla, la cual es que si una persona se autentifica puede obtener el enlace al archivo (si usa un gestor de descarga o viendo el codigo html de la pagina), luego de salir del sistema, esa persona puede pasarle ese mismo enlace a su amigo (sin que su amigo este autenticado).
3.- Mi duda es como evito que una persona, sin estar autenticada en el sistema pueda descarga un archivo?

Gracias por su tiempo.
  #2 (permalink)  
Antiguo 27/07/2013, 12:27
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Restringir descarga de archivos

Hola amiguito lo mas basico es validar la sesion del usuario .

ej:

Código PHP:
Ver original
  1. <?
  2. if(isset($_SESSION['id_usuario']) && isset($_SESSION['is_usuario_logueado']) &&  isset($_SESSION['is_usuario_logueado']) === true){
  3.      //puedo descargar archivos
  4.  
  5. }else{
  6.     //acceso debegado
  7. }
  8. ?>
  #3 (permalink)  
Antiguo 27/07/2013, 13:55
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Restringir descarga de archivos

Pues no, lo que se hace en ese caso es realizar la entrega del archivo manualmente, te dejaré un ejemplo...

Código PHP:
Ver original
  1. <?php
  2.  
  3. //entregas el nombre del archivo o un identificador del mismo para saber que archivo entregar!
  4. $archivo = $_GET['archivo'];
  5.  
  6. /*
  7. si es un identificador deberás guardar el identificador en una DB o en un archivo
  8. donde especifique a que archivo apunta el identificador, por ejemplo:
  9. ID = 1jh2b3kr3b6jk6b7k6
  10. aarchivo = miarchivo.pdf
  11. */
  12.  
  13. //guardas el nombre del archivo en una variable para su uso
  14. $archivo = 'miarchivo.pdf';
  15.  
  16. //envias las cabeceras correspondientes!
  17. header ("Content-Disposition: attachment; filename=".$archivo" ");
  18. header ("Content-Type: application/octet-stream");
  19. header ("Content-Length: ".filesize($archivo));
  20. filereader($archivo);

Obviamente es código incompleto, porque falta que implementes un sistema (una tabla en la DB por ejemplo) donde generes el ID del archivo y el nombre del archivo en si, ya que no te recomiendo en absoluto que pases nombres de archivo por GET o POST, ya que si no implementas medidas de seguridad puede ser un tremendo agujero de seguridad, ya que podrían usarlo para descargar tus archivos de PHP o cualquier otro archivo alojado en el servidor, así si el identificador no existe en la DB no podrán descargar nada que no este preparado para ello....

Por cierto, este archivo lo debes proteger validando que exista una sesión activa para permitir que solo los usuarios que han iniciado sesión puedan descargar los archivos y no tengan acceso a la URL del archivo real...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #4 (permalink)  
Antiguo 27/07/2013, 18:40
Avatar de skyz  
Fecha de Ingreso: abril-2010
Mensajes: 170
Antigüedad: 14 años
Puntos: 1
Exclamación Respuesta: Restringir descarga de archivos

Cita:
Iniciado por Nemutagk Ver Mensaje
Por cierto, este archivo lo debes proteger validando que exista una sesión activa para permitir que solo los usuarios que han iniciado sesión puedan descargar los archivos y no tengan acceso a la URL del archivo real...
Como realizo esta parte?, me podrias indicar porfavor, porque si me autentifico al sistema y obtengo el enlace de un archivo:

http://misitio.com/archivo.rar

luego de cerrar la sesion, puedo descargarme el archivo sin problemas.
  #5 (permalink)  
Antiguo 27/07/2013, 19:01
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Restringir descarga de archivos

o.O sin ofender amigo, pero entiendes como funciona el archivo? el archivo no es magico, no va a proteger los archivos por si solo, como dije debes pasarle el nombre del archivo que quieres proteger la descarga, supongamos que tienes una pagina donde tienes un listado de archivos a descargar...

Código HTML:
Ver original
  1. <p><a href="descargas/archivo1.zip">Archivo 1</a></p>
  2. <p><a href="descargas/archivo2.zip">Archivo 2</a></p>
  3. <p><a href="descargas/archivo3.zip">Archivo 3</a></p>
  4. <p><a href="descargas/archivo4.zip">Archivo 4</a></p>
  5. <p><a href="descargas/archivo5.zip">Archivo 5</a></p>

Para proteger las descargas tienes que usar el código que deje pasandole el nombre del archivo a descargar, por lo cual quedaría el mismo listado de la siguiente forma...

Código HTML:
Ver original
  1. <p><a href="descargas.php?archivo=archivo1.zip">Archivo 1</a></p>
  2. <p><a href="descargas.php?archivo=archivo2.zip">Archivo 2</a></p>
  3. <p><a href="descargas.php?archivo=archivo3.zip">Archivo 3</a></p>
  4. <p><a href="descargas.php?archivo=archivo4.zip">Archivo 4</a></p>
  5. <p><a href="descargas.php?archivo=archivo5.zip">Archivo 5</a></p>

Ve que estoy pasando una variable GET "archivo", el cual contiene el nombre del archivo que quieres proteger, pero esto es muy inseguro, por lo cual es mejor generar un ID para cada archivo, así le pasas el id y la pagina "descargas.php" podrá saber a que archivo se refiere dicho ID....

Ahora, para proteger "descargas.php" tienes que tener un sistema de autenticación de usuarios, por lo tanto al comienzo del código debes verificar que exista dicha sesión, por ejemplo

Código PHP:
Ver original
  1. <?php
  2. if (!isset($_SESSION['autentificado'])) {
  3.      header('location: login.php');
  4.      exit();
  5. }

Obviamente es un ejemplo, así que reemplaza el código por lo que tengas hecho...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #6 (permalink)  
Antiguo 27/07/2013, 19:12
Avatar de skyz  
Fecha de Ingreso: abril-2010
Mensajes: 170
Antigüedad: 14 años
Puntos: 1
Respuesta: Restringir descarga de archivos

Esta bien, gracias por la aclaracion, lo realizare como me indicas y posteare los resultados de las pruebas por aqui :)
  #7 (permalink)  
Antiguo 30/07/2013, 05:54
 
Fecha de Ingreso: julio-2011
Ubicación: Granada
Mensajes: 13
Antigüedad: 12 años, 9 meses
Puntos: 3
Respuesta: Restringir descarga de archivos

Tengo preparado algo muy similar para utilizarlo en mi web. A ver si te sirve:

index.html

Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" type="text/css" href="estilo.css" />
	</head>
	
	<body>
		<ul>
			<li><a href="download.php?f=fichero1.pdf">Fichero 1</a></li>
			<li><a href="download.php?f=fichero2.pdf">Fichero 2</a></li>
		</ul>
	</body>
</html> 
Como verás, los nombres reales de los ficheros están encriptados. En el ejemplo no uso BD:

La variable TIENE_PERMISO haría referencia a si ha hecho login correctamente.

download.php

Código PHP:
<?php
    $f 
$_GET["f"];
    
    if (
$f == "fichero1.pdf"$f "a977e605f70a68dbc2e47c2e3b2d25b2.pdf";
    else if (
$f == "fichero2.pdf"$f "f598551dd30d80e4c215176bb35f47d0.pdf";
    
    
$path "ficheros/" $f;
    
$type "";
    
    
$TIENE_PERMISO true;
    
    if (
is_file($path) && $TIENE_PERMISO) {
        
// Definir headers
        
header("Content-Type: application/force-download");
        
header("Content-Disposition: attachment; filename=" $_GET["f"]);
        
header("Content-Transfer-Encoding: binary");
        
header("Content-Length: " filesize($path));
        
        
// Descargar archivo
        
readfile($path);
    }
    else echo 
"No se ha encontrado el archivo.";
?>
Los ficheros están en el directorio /ficheros, donde está también el siguiente .htaccess:

.htaccess

Código:
AddType application/octet-stream .pdf

RewriteEngine on
RewriteRule ^(.*)$ ../error-403.php
error-403.php

Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" type="text/css" href="estilo.css" />
	</head>
	
	<body>
		<h1>Error 403.</h1>
	</body>
</html> 

Etiquetas: html, restringir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:28.