2013-04-22 38 views
-1

我有一个用户登录页面,然后显示他购买的所有文件。查看您的文件,下载特定的购买文件,受保护的下载页面

我想这样做,当他点击下载文件按钮时,它会立即下载文件。

问题:

用户可以简单地复制链接并把它传递给他的朋友,然后大家可以下载这个文件。

Qestion

我怎么能保护的下载,使用户可以随时下载自己的文件,但其他人不能,他们必须先购买它。

我的想法:

当用户点击下载链接,它会生成一个链接,然后下载文件,该链接将获得10秒后立即删除。

但我不知道,如果它不够好,不保证或如何做到这一点所有..

任何想法?

+0

您需要验证登录的人有权该链接。使用该用户的ID将ID保存到数据库,然后在允许下载之前根据文件ID检查用户ID。重定向到登录页面,如果他们没有登录,或到一个错误页面,如果他们有,但用不上。 – 2013-04-22 16:30:24

+0

如果他们发现真正的下载网址会怎么样?就像.zip结尾一样。 – user1761494 2013-04-22 16:32:01

+0

为什么-2?.... – user1761494 2013-04-22 16:54:14

回答

2

做到这一点的一种方法是,不是直接链接到文件,而是通过PHP脚本进行代理。确保文件是以外的 webroot,以便他们无法直接链接到它。您的PHP脚本可以访问该文件,但Web浏览器无法访问该文件。

当用户点击该链接,脚本会检查他们是否已登录或没有,然后如果他们被允许访问文件或没有。如果他们可以访问该文件,则将该文件(使用正确的标题)发送到浏览器,否则会发出错误。

事情是这样的:

<?php 
session_start(); 

// Figure out if user is logged in and if they can download the file 
if($_SESSION['loggedin'] && can_download($file)){ 
    header('Content-Type: '.mime_content_type($file)); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: no-cache'); 
    header('Content-Length: ' . filesize($file)); 
    readfile($file); 
    exit; 
} 
else{ 
    header('HTTP/1.0 403 Forbidden'); 
    die('You are not allowed to access this file.'); 
} 
+0

试试吧!非常感谢。不知道你可以用标题做这样的事情。 – user1761494 2013-04-22 16:57:27

+0

是的,设置标题可以很有趣。你可以将PHP脚本“假装”成任何东西! :-) – 2013-04-22 17:01:59

1

你可以让链接需要一个有效的登录会话,但这是旁边的点,可能不会实现任何东西。

如果他想与他的朋友分享这个文件,他可以下载它并通过Skype发送文件或在4Shared上上传文件。除了在文件上实施某种类型的DRM,您所做的任何事情都不会阻止用户共享。

+2

DRM ...唯一安全的方式..争论的焦点,如果人们可以只d1和分发。 – Silvertiger 2013-04-22 16:34:12

+1

但问题是,如果他们通过Skype分享保护这些文件被直接下载使用链接,我真的不在乎。我想如果我设置特定下载一个ID,然后当用户尝试下载,它会检查他是否有文件,如果是,在DB下载 – user1761494 2013-04-22 16:36:53

+0

@ user1761494,在这种情况下,储存文件作为一个blob,创建只有当他登录并删除该文件说,10分钟或几个多长但它会采取下载连接速度慢后需求的链接。 – 2013-04-22 16:38:57

0

,你可以创建为登录的用户的会话ID,跟踪它在你的数据库,并只允许有一个匹配的会话ID的用户下载..

OR

需要在页面上认证,只有通过验证的用户可以下载

OR

当用户购买/寄存器有一个表,让他们访问特定的资源,并只允许用户ID与对资源的访问,下载

OR

使用AJAX的网页链接,检查上述任何一种,而不是直接联系的,这样你可以分发链接并仍执行检查

只是一些想法。