Apache下载:确保在下载之前查看了该页面

时间:2008-09-10 16:53:17

标签: php apache cookies protection download

手头的工作:

我想确保我的网站用户在开始下载之前查看页面。如果他们没有查看页面但是尝试直接热链接到文件,他们应该在允许下载之前访问网页。

任何比我发送cookie更好的建议 - 在下载开始之前 - 检查cookie是否存在(通过.htaccess)?

网页和下载文件将位于不同的服务器上。

环境:

  • 所有机器上的Apache 2
  • 所有机器上的PHP 5
  • “网页”服务器上提供的MySQL 5(无法从下载服务器访问)
内森问我试图解决的问题是什么,事实上我想阻止热链接 - 例如 - 论坛。如果人们使用我们的带宽从我们的服务器下载,我想在下载开始之前向他们展示包含广告的页面。它不需要完全安全,但我们需要赚一些钱来为服务器提供资金,对吧? :)

6 个答案:

答案 0 :(得分:5)

不要允许热链接到文件,而是将它们存储在Web可访问路径之外。而是将下载请求转到启动下载的php脚本。您可以放置​​支票以确保请求页面是您想要阅读的页面。

答案 1 :(得分:2)

Apache mod_rewrite RewriteRule可以做到这一点。

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www.example.com/page.html$
RewriteRule file.exe http://www.example.com/page.html [R=301,L]

基本上,如果file.exe的请求没有page.html作为引荐来源,则会将用户重定向到page.html

答案 2 :(得分:1)

你可以使用distributed server side个会话而不是cookie,但这可能比它的价值更麻烦。

您还可以forbid access申请没有推荐人或错误的推荐人。但这比饼干更加可行。

这取决于你关心多少。

答案 3 :(得分:1)

此处的解决方案取决于您尝试解决的问题。如果您只是想确保直接链接不会在论坛和诸如此类的内容中发布,那么只需使用.htaccess检查引荐来源即可。当然推荐人可以很容易伪造,所以如果有人这样做的风险是一个问题,那么你需要做其他事情。

如果您需要更安全的东西,Cookie应该可以解决问题。我们不能只使用php会话,因为文件服务器和网络服务器在不同的盒子上。但我们可以根据时间的哈希值和一些秘密值创建一个cookie。

cookievalue = sha1('secretvalue'.date('z-H'));

当用户请求实际文件时,文件服务器会再次生成此cookie并确保它与用户匹配。这意味着,即使用户伪造了cookie,它也会在一小时后失效,所以谁在乎,并且他们无法生成自己的新的,因为他们不知道秘密值。

答案 4 :(得分:0)

我准备建议.htaccess推荐技巧,但它不是一种非常安全的方法。通过添加自定义http-referral,可以轻松制作PHP脚本。如果您在那里进入下载页面,它会认为您来自该页面。

这是一个相关的问题吗?你能说一下下载页面的背景吗?

答案 5 :(得分:0)

我将使用mod_auth_token来确保用户拥有“最近的链接”。

使用mod_auth_token,您可以创建过期链接,即如果有人决定接收现有链接并将其发布到其他网站,则此链接将在指定时间后过期。这将导致403 FORBIDDEN我可以捕获并将用户重定向到我想要他的HTML页面。