Hay un módulo nginx realmente bueno para hacer esto.
La URL tiene dos parámetros: llamémosle s (seguridad) yt (marca de tiempo). La seguridad es un hash seguro generado a partir de la marca de tiempo, la ruta y una sal (en su caso, solo agregue la ip).
$ip = $_SERVER['REMOTE_ADDR'];
$salt = 'change me cause im not secure';
$path = '/download/webapp.rar';
$timestamp = time() + 3600; // one hour valid
$hash = md5($salt . $ip . $timestamp . $path); // order isn't important at all... just do the same when verifying
$url = "http://mysite.com{$path}?s={$hash}&t={$timestamp}"; // use this as DL url
Para verificar:
$ip = $_SERVER['REMOTE_ADDR'];
$salt = 'change me cause im not secure';
$path = $_SERVER['REQUEST_URI'];
$hashGiven = $_GET['s'];
$timestamp = $_GET['t'];
$hash = md5($salt . $ip . $timestamp . $path);
if($hashGiven == $hash && $timestamp <= time()) {
// serve file
} else {
die('link expired or invalid');
}
Ahora sólo tiene que volver a escribir las descargas de este "hombre en el medio" -script y ya está.
Ejemplo de reescritura para nginx:
location /download {
rewrite ^.*$ /download.php last;
break;
}
No estoy muy familiarizado con Apache reescribe por lo que puede comprobar esto por sí mismo.
Si está utilizando uno de los siguientes módulos, no necesita verificar todo esto usted mismo y es mucho mejor en cuanto al rendimiento, pero tenga en cuenta que ofrece más configuración y a veces otra forma de generar el url y el hash (ver módulo documentos aquí).
O simplemente utiliza el nginx módulo de enlace seguro: http://wiki.nginx.org/HttpSecureLinkModule
También hay un colgante para el lighty: http://redmine.lighttpd.net/wiki/1/Docs:ModSecDownload
O el nginx segura módulo de descarga: http://wiki.nginx.org/HttpSecureDownload
Tal vez hay algo para Apache también ... Tal vez puedas hacer algo con reescrituras allí ...
"Without any databases"? ¿Qué tipo de requisito es eso? Usted * absolutamente * tiene que almacenar algunos datos para resolver este problema, y una base de datos es el * mejor lugar * para hacerlo. ¿Por qué estás tratando de evitar el uso de una base de datos? – meagar
Sin la base de datos, puede lograr esto usando 'cookies' configurando' expiry'. Sin embargo, el problema con eso es que puedes eliminar las cookies. así que esta no es una manera confiable. –
@GhazanfarMir ... aparte del hecho de que las cookies pueden ser falsificadas tan fácilmente que las vuelven prácticamente inútiles para esto ... – DaveRandom