сгенерировать ссылку на файл

asker23

Новичок
сгенерировать ссылку на файл

Нужно защитить приватный файл от прямого скачивания.
Как можно с генерировать уникальную ссылку для скачивания файла, которая будет активна 24 часа ?
 

Beavis

Banned
создаешь ссылку, запоминаешь на какой файл она ссылается и когда создана, а потом когда пользователь переходит по ней, проверяешь время её создания, и если оно меньше 24 часов - отдаешь файл =)
 

dimagolov

Новичок
ну ты ссылки где, наверное в базе будешь хранить. вот там же и храни время, до которого она валидна.
 

SiMM

Новичок
Вообще можно ничего нигде не хранить, если формировать URI специальным образом - оно должно содержать зашифрованную дату окончания срока действия ссылки + путь к файлу. Плюс можно какую-нибудь случайную ерунду подмешивать и контрольную сумму.
 

Beavis

Banned
SiMM
И получится ссылка длиной как само содержимое файла)
Не вижу ничего плохого в хранении ссылки в базе, тем более что это позволяет делать короткие красивые ссылки..)
 

nalim

Новичок
можно

можно хранить и в URL
солить наверное не надо в этом случае (подмешивать данные)
т.к. всеравно это должен быть алгоритм который можно легко преобразовать в обратную сторону
(т.к. придется же всевремя расшифрововать чтобы смотреть дату)

-~{}~ 22.06.09 09:53:

Beavis

UNIXTIME не займет бездну места в URL)
другой вопрос что это менее надежно
т.к. хиттрые люди смогут сами генерить
но зато статическая ссылка будет невозможна
(особенно если ограничивать время и конца и начала)
чтобы нельзя было сделать дату истечения 2020 год
 

SiMM

Новичок
> солить наверное не надо в этом случае (подмешивать данные)
> т.к. всеравно это должен быть алгоритм который можно легко преобразовать в обратную сторону
И как соль противоречит этому? Я же не про хэширование говорю, а про шифрование.

> другой вопрос что это менее надежно
> т.к. хиттрые люди смогут сами генерить
Вот именно для этого и нужно шифрование, и соль, для пущей сложности.

> И получится ссылка длиной как само содержимое файла)
Не получится. Да и в данном случае никого красивые URL'ы не интересуют.

> Не вижу ничего плохого в хранении ссылки в базе
Дело не в "плохо" или "хорошо", дело в целесообразности. Может быть и целесообразно (мало ли что за задачи стоят), а может и нет. Если цель - отдача контента по ссылке не дольше, чем до определённой даты, и ничего более - особого смысла заводить для этого таблицу лично я не вижу.
 

nalim

Новичок
> другой вопрос что это менее надежно
> т.к. хиттрые люди смогут сами генерить
Вот именно для этого и нужно шифрование, и соль, для пущей сложности.
хм))) т.е. закрытый ключ?)
устойчивость очинь сомнительна такого шифра)
можно примерчик?)
 

SiMM

Новичок
> устойчивость очинь сомнительна такого шифра)
Возможно, однако ещё остаётся вопрос - кто будет с этим заморачиваться, тем более, не зная алгоритма формирования ссылок?
Соль (если это можно так назвать) - исключительно для того, чтобы сбить с толку и при одинаковых входных данных получались разные данные на выходе.
Само имя файла, в принципе, кодировать не зачем. Для иллюстрации - пример (без urlencode ссылки и практически из мануала).
PHP:
$key = "This is a very secret key";
$filename = '/download/file.txt';
$rand = mt_rand(-getrandmax(),getrandmax());
$time = time()+24*60*60;

$text = pack('vV',$rand,$time);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$crypttext = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv));
echo "$filename?$crypttext\n"; # /download/file.txt?i2udsWJx8hyAOzYfQsuXtWyUIgMXM+h8kg4EwuYCfYY=

$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$text = mcrypt_decrypt(MCRYPT_RIJNDAEL_256,$key,base64_decode($crypttext),MCRYPT_MODE_ECB,$iv);
$tmp = unpack('v/Vtime',$text);
echo date('r',$tmp['time']); # Tue, 23 Jun 2009 13:06:33 +0400
 

nalim

Новичок
SiMM
ну да)
если нет алгоритма - то придется сильно заморочиться)
если код недоступен юзерам то оч даже надежно
 
Сверху