2011-10-27 10 views
5

c'è un collegamento diretto per scaricare un file. che gli utenti possono scaricare link dopo payout, in questo modo:Genera il link per il download ip e time limited

http://example.com/download/webapp.rar 

Ma ho bisogno di generare ip e tempo limitato link di download per evitare sanguisuga il file con gli altri. Voglio farlo senza utilizzare alcun database. qualcosa di simile:

http://example.com/download.php?a5fds588fgdf 

o

http://example.com/download/a5fds588fgdf 

c'è qualche consiglio?

+10

"Senza database"? Che tipo di requisito è questo? Devi assolutamente * memorizzare * alcuni dati per risolvere questo problema, e un database è il posto migliore * di gran lunga * per farlo. Perché mai stai cercando di evitare l'uso di un database? – meagar

+0

Senza il database, è possibile ottenere ciò usando 'cookie' impostando la loro' scadenza '. Tuttavia, il problema è che è possibile rimuovere i cookie. quindi questo non è un modo affidabile. –

+1

@GhazanfarMir ... a parte il fatto che i cookie possono essere falsificati così facilmente da renderli praticamente inutili per questo ... – DaveRandom

risposta

23

C'è un modulo nginx veramente buono che lo fa.

L'URL ottiene due parametri: chiamiamoli s (sicurezza) e t (timestamp). La sicurezza è un hash sicuro generato da timestamp, path e sale (nel tuo caso basta aggiungere l'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 

per verificare:

$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'); 
} 

Ora è solo bisogno di riscrivere il download a questo "man in the middle" -script e si è fatto.

Esempio riscrittura per nginx:

location /download { 
    rewrite ^.*$ /download.php last; 
    break; 
} 

io non sono davvero familiarità con apache riscrive così si può verificare da soli.

Se si utilizza uno dei seguenti moduli, non è necessario verificare tutto da soli ed è molto più performante, ma si noti che offre una maggiore configurazione e talvolta un altro modo per generare l'url e l'hash (vedere modulo documenti qui).

Oppure basta usare il nginx sicuro modulo di collegamento: http://wiki.nginx.org/HttpSecureLinkModule

C'è anche un ciondolo per lighty: http://redmine.lighttpd.net/wiki/1/Docs:ModSecDownload

O il nginx sicuro modulo di scaricare: http://wiki.nginx.org/HttpSecureDownload

Forse c'è qualcosa per apache troppo ... Forse potresti fare qualcosa con riscrive lì ...

+0

Questo è un fantastico modo fantastico per dirlo! Grazie ! – Tom

+0

@ Hikaru-Shindo Grazie amico, puoi mettere il mio esempio di link per il tuo script (per il mio test) – Nulled

+0

@NuLLeR Ho riscritto la mia risposta per abbinare il tuo esempio e ho aggiunto qualche informazione in più su cosa prendere in considerazione. –

4

Se non siete preoccupati per la gente essere in grado di decodificare alcuni parametri come IP o timestamp si potrebbe provare qualcosa di simile:

<?php 
$salt = 'SALTING'; // Hash cipher 
$key = new stdClass(); 
$key->limit = time()+3600; // 1 hour limit 
$key->ip = $_SERVER['REMOTE_ADDR']; 
$key->security = sha1(sha1($salt.serialize($key))); // Double sha1 for fun 

$key_param = base64_encode(serialize($key)); 

echo sprintf('http://mysite.com/download/%s', $key_param); 
?> 

Ora che è per ottenere una chiave univoca, valida 1 ora, per ip $ a chiave> ip.

per verificarlo:

<?php 
$salt = 'SALTING'; 
$key = $_GET['key']; 
$key = base64_decode($key); 
$key = unserialize($key); 
if($key->security != sha1(sha1($salt.serialize($key)) || $_SERVER['REMOTE_ADDR'] != $key->ip) { 
    throw new Exception('Security breach. U mad bro ?'); 
} 
?> 

E il gioco è fatto :) Nessun database coinvolti. Solo hashing e hash di corrispondenza in seguito.

Ma suppongo che un semplice $_SESSION[$file_id] = time()+3600; farebbe il trucco in una riga ... Non è così divertente però.

+2

@meagar Problema? – Tom

+0

Than per aver reso me LOL al lavoro. – meagar

+0

@ Tom Grazie, dove devo impostare il mio nome file "webapp.rar"? – Nulled

0

Il mio consiglio migliore sarebbe utilizzare un database!

Ma se dovete assolutamente positivamente farlo senza poi vorrei suggerire utilizzando una libreria di cache come cache-lite: http://pear.php.net/manual/en/package.caching.cache-lite.intro.php

Molti framework PHP (se si utilizza uno) venire anche con una libreria di caching

È possibile memorizzare nella cache l'IP e la chiave casuale assegnata con una data di scadenza (alcune librerie di cache consentono anche di assegnare il tempo di validità della cache)

Problemi correlati