2013-07-12 4 views
0

Я хотел бы создать временные ссылки, чтобы предотвратить прямую загрузку файлов.Безопасные загрузки без аутентификации

Поток должен быть таким:

пользователя приобрести файл, указывая только адрес электронной почты -> отправляет письмо по этому адресу с URL к временному файлу купленного.

Я хочу этот url доступен только для 3 раз.

Как я могу это сделать? Использование Symfony2 на сервере Apache.

Приносим извинения за просьбу крайне неопределенно, но я ослеп, и я не знаю, что искать, чтобы найти способ.

+0

Вы можете защитить URL-адрес в базе данных. И подсчитайте, сколько раз URL-адрес существует в базе данных. – Perry

ответ

0

Создайте случайный ключ, создайте таблицу mysql, которая содержит fileid, key, number_of_downloads.

Каждый раз, когда пользователь нажимает на ссылку http://www.yourdomain.com/getfile.php?file=blah&key=blahblah, вы можете обновить таблицу number_of_downloads. Если это < 2, перенаправляйте файл (используйте php-заголовок или перенаправление симфонии), если он> 2, дайте 404 или что-то еще ...

+2

Я бы не предлагал перенаправить файл, потому что это означало бы, что файл будет общедоступным (и, следовательно, не особо безопасным). Вместо этого поместите файл за пределы корня документа и на странице загрузки будет отображаться содержимое файла. Вам нужно будет убедиться, что файл является единственным, что повторяется (без HTML), и вам нужно отправить тип содержимого (что-то вроде 'header (« Content-Type: application/octet-stream »)». – nkorth

0

Это должно быть довольно просто (хотя я мало что знаю о Symfony2). У вас будет страница загрузки, которая получит параметр «ключ» (возможно, /download?key=blahblahblah). Создайте базу данных (или другое хранилище), и всякий раз, когда вам нужно создать ссылку для загрузки, введите свой код и сохраните его в базе данных. У каждого ключа также может быть число, прикрепленное к нему, для количества раз, когда оно еще может быть использовано, или, альтернативно, время истечения. На странице загрузки убедитесь, что ключ по-прежнему действителен, и если это так, выполните файл.

Edit: Вот пример служит файл через PHP скрипт:

// this may need to change depending on the file type 
header("Content-Type: application/octet-stream"); 
// this makes sure the downloaded file doesn't get named "download.php" 
header("Content-Disposition: attachment; filename=stuff.zip"); 
// and this sends the file 
echo file_get_contents("/path/to/stuff.zip"); 

Редактировать снова: На самом деле, this, вероятно, лучший способ.