Ver Mensaje Individual
  #10 (permalink)  
Antiguo 08/08/2006, 19:40
califa010
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
La idea, esquemáticamente, sería la siguiente:

Partimos de:

servidor1.com/index.php

Al seguir un link de descarga, llamamos a un script que va a dar el "alta" al código de descarga en el archivo de texto log_descargas (fuera de de la raíz del servidor1, no hace falta que tenga la extensión .txt) y luego redireccionar al script de descarga en sí, en el servidor2.

O sea, pasamos por:

servidor1.com/alta_descarga.php?archivo=algo.rar&codigo=sdf7dsfk jdetcétera
(donde el código es un valor aleatorio encriptado en md5, o sea de, 32 caracteres, lo que lo hace bastante difícil de "rompe" con fuerza bruta).

Después de dar de alta ese registro, se redirecciona entonces a:

servidor2.com/descargas.php?archivo=algo.rar&codigo=df7dsfkjdetc étera

servidor2.com/descargas.php hace una "consulta" a servidor1.com/validar_descarga.php?archivo=algo.rar&codigo=df7ds fkjdetcétera

Esa consulta consiste en realidad en abrir el archivo validar_descarga.php (con file_get_contents(), por ejemplo). Como servidor1.com/validar_descarga.php es un script que se abre por http, el resultado es el mismo que si pusieras esa URL en el navegador; o sea, devuelve el resultado del script una vez procesado.

servidor1.com/validar_descarga.php toma los datos que recibe por querystring, abre el archivo log_descargas (en servidor1, no accesible por URL) con file(), recorre cada línea como un índice de un array y busca una coincidencia entre los datos recibidos y algún "registro".

Si la encuentra, devuelve valido=1 (y además podría eliminar ahí mismo el "registro" de log_descargas, para evitar que un código válido sea usado más de una vez). Si no, devuelve valido=0 (o lo que fuera, pero la idea es esa). Esa respuesta va a ser estar en el string que devuelve la llamada a la función file_get_contents() que hace servidor2.com/descargas.php. De acuerdo a la respuesta, entonces, envía el archivo al cliente o no y redirecciona al servidor1, "cerrando el círculo".

Si te fijás, para el servidor2, el sistema es "transparente", por así decirlo. Nunca accede directamente a los datos. Simplemente, consulta al servidor1 si los datos que le pasa son válidos para proceder a la descarga. Dónde están esos datos, o cuál es el procemiento para obtenerlos, es indistinto; el script servidor2.com/descargas.php estaría actuando como un "cliente" que requiere un servicio específico del servidor1. *

Con respecto a que los datos viajen por URL, no veo mayor inconveniente. Cada código sería único y podría usarse sólo una vez. Y, es cierto, en teoría alguien podría ponerse a pasarle parámetros a servidor1.com/validar_descarga.php para encontrar una combinación válida de nombre de archivo / código, pero tendría que embocar un string aleatorio de 32 caracteres junto con el nombre del archivo; y además, no le serviría de mucho, porque al encontrar un resultado válido, esa combinación se elimina de la "base" (ya que eso supondría que la descarga se llevó a cabo). (Y en definitiva, es la misma idea de un login: tenés un formulario y si tenés tiempo que perder, paciencia y ganas, probá meter nombre de usuario y clave al azar cuantas veces quieras, pero las probabilidades de que logres entrar de esa manera, aun automatizando el proceso, son mínimas si las claves están encriptadas...)

Bueno, espero haberme explicado mejor. No sé si me estaré pasando por alto algo, pero en principio, la idea me parece viable y no tan compleja de implementar.

Suerte
Califa

* Ahora que releo este párrafo, veo que en realidad con este equema no habría inconvenientes en usar una base de datos "en serio" (un server de base de datos local a servidor1.com), porque el único que haría las consultas directamente sería precisamente sería el servidor 1, que corre en la misma máquina...

Última edición por califa010; 08/08/2006 a las 20:00