| |||
En principio con PHP puedes redireccionar automáticamente con cabeceras HTTP usando: Código PHP: No sé si será eso lo que necesitas, si explicas mejor que deseas hacer tal vez nos quede más claro que implementar. Un saludo,
__________________ Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo. |
| |||
Código PHP: Mira esta funcion con la que puedes generar un codigo ramdom y lo guardas en La DB, luego cuando el usuario valla a bajar el archivo verificas que sea ese y sigues haciendo lo que quieras A este script solo tenes que especificarle la longitud del codigo a generar Saludos,
__________________ ----------------------------- Edgar Gonzalez |
| |||
Cita: Lo puedes solventar sin necesidad de códigos extra de momento usando la funcionalidad "hotlink" de tu panel de control y sòlo autorizando las llamadas que vengan de tu dominio X.com determinado. Usas cPanel o algùn panel de control en tu sitio? (también se puede hacer con .htaccess en su defecto a "mano").¿Entendeis mi problema? Lo que quiero es evitar el HOTLINK y permitir la descarga solo cuando se conecten a mi pagina principal... Es un lio esto de tener varias cuentas je je je La idea del código es valida ..pero tu en ese caso tanto dominio1.tal como domino2.tal deberían verificar ese código contra el dato que almacenes en una Base de datos (con acceso remoto y no sólo conexiones "locales" permitidas). En el link que generas en domino1.tal .. almacenas tu "password" generado en tu BBDD y en domino2.tal .. accedes a tu BBDD (la misma centralizada) para consultar si ese "código" generado para esa descarga existe y asì validas. Un saludo,
__________________ Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo. |
| |||
Buenas, Podrías aplicar esa misma lógica de validación usando archivos de texto en vez de una base de datos (que sería más práctico si fuera posible). Cuando alguien pide una descarga, en vez de hacer una consulta a la DB, grabás los mismos datos en un archivo de texto plano en tu server principal, en alguna carpeta que quede afuera de la raíz pública (o sea, no accesible por URL). Ahí podrías guardar el nombre del archivo más un código aleatorio, encriptado con md5 o sha, por ejemplo, con algún formato que te permita hacer un split fácilmente. archivo67.rar|||algun_codigo_aleatorio Al final de cada "registro", agregás un salto de línea "\n"; eso después te va a permitir acceder a cada uno fácilmente con la función file(), que lee un archivo y devuelve un array donde cada elemento es una línea. descargas.php, desde el otro servidor, debería hacer la validación de esos mismos parámetros,que le llegan por querystring, contra los datos de ese archivo. Lógicamente que la idea es que no acceda directamente a ellos (no va a poder porque los datos no son accesibles directamente por URL), si no que use un script que le haga de "interfaz", pongamos, validar.php. descargas.php envía los datos y recibe una respuesta como por ejemplo, validado=1 (o sea, hace un file_get_contents() a validar.php, pasando por querystring los parámetros anteriores). En ese caso, se hace la descarga; si no, se rechaza. Es un poco más de vuelta, pero creo que podría funcionar. O, al menos, tal vez te dé alguna idea. Suerte Califa PD: Para que todo quede más limpio y "redondo", deberías dar de "baja" el registro correspondiente luego de haber validado la descarga desde validar.php .(o eventualmente, al menos, pasar también la hora y archivarla como parte del registro, para validar el tiempo transcurrido entre el pedido y la descarga, para que la habilitación para una descarga sea sólo "temporal" si no es completamente dinámica -- se genera y se destruye en el momento). PD2: Para que esto funcione, deberías chequear que puedas usar fopen y afinas para abrir archivos remotos a partir de una URL. Última edición por califa010; 08/08/2006 a las 18:42 |
| |||
Cita: El problema es que tiene que acceder a esos datos en forma "segura" desde dos dominos diferentes .. por ende un ".txt" colcado con acceso HTTP comùn .. podrìa ser fácilmente localizable y visualizado su contenido.Podrías aplicar esa misma lógica de validación usando archivos de texto en vez de una base de datos (que sería más práctico si fuera posible). El sistema que propones es el de una "sesiòn" .. podría servir la gestiòn del "SID" (el identifiador ùnico y aleatorio de esos datos relacionados). Pero la "BBDD" a no ser que implementes algún tipo de "web service" con algùn sistema de "autentificación" .. el archivo de texto plano tendra que quedar bajo acceso HTTP igualmente para que lo puedas acceder desde el otro servidor (o lo vas acceder por FTP o SSH?) Por eso una base de datos cualquiera (con acceso TPC/IP) ya tiene su soporte mìnimo de seguridad al respecto: un "host" al que conectarte, un usuario y un password para conectarte. Un saludo,
__________________ Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo. |
| |||
Cita: Cluster, no estoy seguro de entender el problema (o de que me hayas entendido). La idea es que el archivo con los datos de validación sólo va a ser accedido directamente desde el server principal. El servidor de descargas consultaría a un script en el servidor principal, que le entregaría solamente una respuesta a partir de la "consulta" enviada; pero el servidor de descargas no estaría accediendo directamente a los datos, simplemente "preguntándole" al otro si los datos que le entregó son válidos.El problema es que tiene que acceder a esos datos en forma "segura" desde dos dominos diferentes .. por ende un ".txt" colcado con acceso HTTP comùn .. podrìa ser fácilmente localizable y visualizado su contenido. Cita: Es probable que tengas razón... Pero si no me equivoco, sería un detalle de implementación, acaso más eficiente, aunque la mecánica seriá la misma.El sistema que propones es el de una "sesiòn" .. podría servir la gestiòn del "SID" (el identifiador ùnico y aleatorio de esos datos relacionados). Suerte Califa PD: muy interesante este post Última edición por califa010; 08/08/2006 a las 18:58 |
| |||
No entendì bien tu propuesta (podrìas hacer un pequeño esquema?) .. Ten presente que es el servidor "2" (auxiliar .. no el principal) el que contiene el archivo a descargar. El servidor "2" tiene script para entregar la descarga: http://www.servidor2.com/descargar.p...=98asd9f89adsf Esa validaciòn se debe hacer contra la referencia indicada (ese código) para obtener el nombre de archivo a descargar o autorizaciòn en general. Como desde servidor2.com .. voy a servidor-principal.com a ver si existe mi "codigo" de validación y si es igual al que generé desde servidor-principal.com ? No debe hacerse por el URL (se verìa mi script de validaciòn por mèdio y el paràmetro que le paso) .. a no ser una conexiòn por "sockets" o algo asì (que no pase por el "cliente" .. ) no se me ocurre mejor soluciòn, simple y ràpida que usar una BBDD como "puente" para almacenar esos datos y con la seguridad que de por sí ellas aseguran. Un saludo,
__________________ Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo. |
| |||
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 |
| |||
Cita: Ahì es donde podrìa esta la falla de seguridad .. Si averigüas el URL de tu script validar_descarga.php .. podrías alterar su llamada. 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. Es cierto que el objetivo es realizar una validaciòn para "el momento" donde tras el proceso principal de descarga o lo que corresponda se invalida ese "código" generado. Es correcto tu planteamiento .. pero yo insisto que todo esto si se dispone de BBDD (con acceso remoto permitido; cosa que sé que no todo proveedor deja este tipo de conexiones) se puede hacer bastante ràpido y muy seguro. Un saludo,
__________________ Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo. |
| |||
Bueno, volviendo al tema original, a la pregunta original. Hay básicamente 3 formas de que un php se interprete: 1.- header("Location: http://..../archivo.php?varX=valor"); exit; (el exit no es obligatorio para redireccionar, pero hace que el archivo actual NO siga interpretándose) 2.- fopen('http://....../archivo.php?varX=valor'); Donde se pide por http el archivo, sin redireccionar. El resultado puede obtenerse después accediendo al gestor generado por la función (también puede usarse file() o file_get_contents(), según la versión de php) 3.- include(http://....../archivo.php?varX=valor) Funcionaría igual que fopen al ser una petición a otro servidor, pero también sería transparente y sin redirección.- Espero que esto conteste la pregunta original. Saludos. |
| |||
Cita: Algunas observaciones:
Iniciado por alvlin Bueno, volviendo al tema original, a la pregunta original. Hay básicamente 3 formas de que un php se interprete: 1.- header("Location: http://..../archivo.php?varX=valor"); exit; (el exit no es obligatorio para redireccionar, pero hace que el archivo actual NO siga interpretándose) 2.- fopen('http://....../archivo.php?varX=valor'); Donde se pide por http el archivo, sin redireccionar. El resultado puede obtenerse después accediendo al gestor generado por la función (también puede usarse file() o file_get_contents(), según la versión de php) 3.- include(http://....../archivo.php?varX=valor) Funcionaría igual que fopen al ser una petición a otro servidor, pero también sería transparente y sin redirección.- Espero que esto conteste la pregunta original. Saludos. En el caso 2 y 3 con una llamada con un "wrapper" como http:// .. siempre se obtendrà el resultado del proceso, esa "salida" que ese script al ejecutarlo origine. Esto es importante .. pues no se comporta igual si lo hacemos a un archivo por ruta absoluta .. ahì obtenemos su "código fuente PHP" (por decirlo de alguna forma). Un saludo,
__________________ Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo. |
| |||
Cita: Sí, pero además de que en este caso al validar un código lo "destruís", igual creo que tendrías más posibilidades de averiguar una combinación válida interceptando datos válidos mientras viajan no encriptados, que tratando de romper un md5. Ahì es donde podrìa esta la falla de seguridad .. Si averigüas el URL de tu script validar_descarga.php .. podrías alterar su llamada. Cita: Creo que sería más práctico, también. (Aunque el hecho de que en este caso no se pueda acceder directamente a tu DB desde otro servidor también suma a la seguridad del sistema, me parece). pero yo insisto que todo esto si se dispone de BBDD (con acceso remoto permitido; cosa que sé que no todo proveedor deja este tipo de conexiones) se puede hacer bastante ràpido y muy seguro. Suerte Califa |
| |||
Cita: Un comentario sobre esto, hacer un include a través de http es muy peligroso. Mientras controles 100% ese servidor, no habría mayores problemas, pero si no es el caso, los resultados podrían ser muy serios. Da igual si incluís un archivo .php, .jpg o lo que sea. Más allá del nombre o la extensión del archivo, include lo único que hace es "pegar" lo que devuelve el pedido.3.- include(http://....../archivo.php?varX=valor) Funcionaría igual que fopen al ser una petición a otro servidor, pero también sería transparente y sin redirección.- Si desde server1.com/index.php incluís, pongamos Código PHP: Código PHP: De la misma manera, si no tenés control total del server2, podría modificarse para que no interpretara ese archivo php (creo que eso se puede hacer incluso según los directorios con .htaccess) En síntesis, los includes deberían ser a paths absolutos (de la máquina local) y si son dinámicos, estar bien validados. Suerte Califa |
| |||
Cita: cURL (www.php.net/curl) es la implementación más avanzada de los conceptos básicos de hacer un "fopen()" a un URL remoto .. con la particularidad que puede conectarse a "URL's" que pasen por SSL entre otras cosas.
Iniciado por Saludos Jo, tios... que soy un novatillo en esto de PHP je je je Gracias a todos por las respuestas, pero algunas cosas que me proponeis son muy dificiles para mi je je je Creo que voy a utilizar el htaccess (porque ya lo he utilizado otras veces) y protegeré los videos así... Por cierto, buscando en Internet he encontrado que en PHP hay una libreria llamada CURL (libcurl) ..... que sirve para enviar informacion entre diferentes servidores. http://es2.php.net/manual/es/ref.curl.php aqui un ejemplo que he encontrado : Código PHP: GRACIAS a todos. Un saludo,
__________________ Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo. |
| |||
Una solucion un poco matematica Hola, lo que puedes hacer es generar un numero con determinada logica y tu tienes la llave para decifrarlo, esto se basa en crear una funcion matematica que le puedas aplicar la funcion inversa y validar el dato obtenido. Por ejemplo, al generar el link uno podria generar potencias de dos y concatenarlas por ejemplo <a href="www.mipagina.com/descargar.php?id=248">DESCARGAR</a> Luego el modulo descargar.php toma la variable id y comienza a calcular si 2 es potencia de dos, si 4 es potencia de dos y si 8 es potencia de dos si todo da bien permite la descarga. Bueno, esta solucion esta buena ya que no se ralizan escrituras en disco (osea crear un archivo y guardar datos) esto es una de las cosas mas caras en tiempo de ejecucion y no se sobrecarga la base de datos con consultas. Es claro que el que quiera copiar el link debe de saber como generas la clave osea conocer la funcion o ver suficientes links como para desifrar el patron, pero si el patron generado depende de la hora en que se ralizo ya se torna cuasi imposible que le sea util la clave luego de haber pasado esa hora. Saludos. |