如果您选择直接在文件系统上保留高价值的可下载内容文件,最好的做法是将它们保留在webroot之外。然后,您的应用程序必须解决为内容(PDF、Word 文档、歌曲等)创建 URL(必要时进行 url 编码)的问题。
通常,这可以通过使用查询来检索文件路径,然后在用户header()
单击锚点时使用文件路径将内容发送给用户(使用等...)来实现(所有这些都没有用户看到)真正的服务器端文件路径)。
如果你不希望用户一个高价值的下载内容到用户共享的网址乙,那么你的应用程序必须以某种方式使完全依赖于用户的链接一个。可以做什么?我应该从哪里开始?
显然,您要确保用户A在会话期间已登录,然后他或她才能下载文件。什么是不那么明显的是如何防止一个登录用户乙使用从用户发送的URL一个(用户乙)下载A的数字内容。
使用$_SESSION
存储的登录用户的ID(数字或字符串),使最终的查询部分(假设内容被绑定到用户购买或东西)将防止登录的用户乙从网上下载他们没有东西买,但你仍然会导致资源命中来处理他们尚未购买的项目的 SQL 空集。这听起来是很好的第二步。
第一步呢?有什么可以阻止需要做一个查询开始?
好吧,让我们看看。在 HTML 表单中,可以在隐藏字段中使用 XSRF 令牌来验证提交的表单实际上来自接收 POST/GET 请求的 Web 服务器。一个令牌用于整个表单。
给定要下载的用户特定内容(锚点)的页面,可以将单个令牌(相同的令牌,但每个页面请求不同)href
以查询字符串参数的形式嵌入每个锚点的属性中,并将该令牌的副本存储在$_SESSION
.
现在,当登录用户B尝试使用登录用户A 的共享 URL 时,整个事情都会失败,因为用户A和用户B具有不同的会话(或者根本没有会话),因此令牌不同。换句话说,“我的链接和你的一样,但不同。” 锚点将与会话相关联,而不仅仅是与页面、用户或内容相关联。
有了该系统,PHP 可以确定对内容的请求是否有效,而无需涉及数据库(通过将提交的令牌与 中的令牌进行比较$_SESSION
)。此外,可以建立时间限制$_SESSION
来限制有效 XSRF 令牌的持续时间/生命周期。只需使用time()
函数和基本数学。在这种情况下,60 分钟可能是锚点的理想令牌生存期。如果单击的锚点的令牌已过期,请让用户再次登录。
如果您使用文件系统上的文件并将路径存储在数据库中,请确保您也执行以下操作(至少)。
$_SESSION
系统来阻止会话固定。我想到了一些选择.
如果您使用的是Apache,则可以使用htaccess来保护目录.(第一个用Google搜索链接:http://www.javascriptkit.com/howto/htaccess3.shtml)
或将文件存储在Web服务器上方.在php中创建一个脚本,允许授权用户访问它们.
如果您想通过FTP进行操作,并且您正在运行cpanel,则可以创建新的ftp帐户.检查yourdomain.com/cpanel以确定您是否安装了它.
将文件存储在数据库中是非常糟糕的做法。仅存储有关文件的信息是非常好的做法。名称、扩展名。文件保存在服务器上,例如 $id.$ext。这将是一个很好的架构。当用户下载文件时,他会在数据库中获取带有名称的文件。
对不起我的英语不好。
归档时间: |
|
查看次数: |
26512 次 |
最近记录: |