Apache下载:下载前请确保已查看该页面
手头的工作:
我想确保我网站的用户在开始下载之前先查看页面。如果他们没有浏览页面,而是尝试直接链接到文件,则应该在允许下载之前访问该网页。
有什么建议比我发送Cookie的想法更好,并且在下载开始之前检查Cookie是否存在(通过.htaccess)?
网页和下载文件将位于不同的服务器上。
环境:
- 所有机器上的Apache 2
- 所有机器上的PHP 5
- 在"网页"服务器上可用的MySQL 5(无法从下载服务器访问)
内森(Nathan)问我想解决什么问题,实际上是我想防止来自例如论坛的热链接。如果人们使用我们的带宽从我们的服务器下载,我想在下载开始之前向他们显示带有广告的页面。它不需要完全安全,但是我们需要赚钱来为服务器融资,对吗? :)
解决方案
回答
我们可以使用分布式服务器端会话来代替cookie,但这可能比其价值更大。
我们也可以在没有引荐来源网址或者引荐来源网址错误的情况下禁止访问请求。但这比cookie还要脆弱。
这取决于关心程度。
回答
与其允许热链接到文件,不如将它们存储在可通过网络访问的路由之外。相反,使下载请求转到启动下载的php脚本。我们可以进行检查,以确保请求页面就是我们要阅读的页面。
回答
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"作为引荐来源网址,则它将301将用户重定向到" page.html"。
回答
我将建议.htaccess引用技巧,但这不是一个非常安全的方法。制作PHP脚本很容易,并添加了自定义的http-referral。如果我们在此处进入下载页面,它将认为我们来自该页面。
这是一个相关的问题吗?我们能告诉我们有关下载页面上下文的信息吗?
回答
这里的解决方案取决于我们要解决的问题。如果我们只是尝试确保直接链接不会在论坛中发布,而是使用.htaccess检查引荐来源就足够了。当然,可以很容易地伪造引荐来源网址,因此,如果有人这样做会带来风险,那么我们就需要做其他事情。
如果我们需要更安全的东西,cookie应该可以解决问题。我们不能仅使用php会话,因为文件服务器和Web服务器位于不同的盒子上。但是我们可以基于时间的哈希值和一些秘密值来创建cookie。
cookievalue = sha1('secretvalue'.date('z-H'));
当用户请求实际文件时,文件服务器会再次生成此cookie,并确保它与用户匹配。这意味着,即使用户伪造了cookie,一小时后它也会失效,所以谁在乎,他们就无法生成自己的新cookie,因为他们不知道秘密值。
回答
我将使用mod_auth_token来确保用户具有"最新链接"。
使用mod_auth_token可以创建过期链接,即,如果某人决定采用现有链接并将其发布到另一个网站上,则该链接将在指定时间后失效。这将导致403 FORBIDDEN,我可以捕获该用户并将其重定向到我希望他访问的HTML页面。