代码之家  ›  专栏  ›  技术社区  ›  Marcelo Cantos

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

  •  1
  • Marcelo Cantos  · 技术社区  · 16 年前

    手头工作:

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

    有什么比我发送cookie更好的建议吗?在下载开始之前,检查cookie是否存在(通过.htaccess)?

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

    环境:

    • 所有机器上的Apache 2
    • 所有机器上的php 5
    • “网页”服务器提供MySQL5(下载服务器无法访问)

    内森问我要解决的问题是什么,事实上,我想阻止热点链接,例如论坛。如果人们使用我们的带宽从我们的服务器下载,我想在下载开始之前给他们显示一个带有广告的页面。它不需要完全安全,但我们需要赚些钱来资助服务器,对吗?:)

    6 回复  |  直到 9 年前
        1
  •  5
  •   sergtk    16 年前

    不允许对文件进行热链接,而是将它们存储在可访问Web的路由之外。相反,让下载请求转到启动下载的PHP脚本。您可以设置检查以确保请求的页面是您想要阅读的页面。

        2
  •  2
  •   ceejayoz    16 年前

    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重定向用户到 页面HTML .

        3
  •  1
  •   Vinko Vrsalovic    16 年前

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

    你也可以 forbid access 没有引用者或引用错误的请求。但这比饼干更容易伪造。

    这取决于你有多在乎。

        4
  •  1
  •   Nathan    16 年前

    这里的解决方案取决于您试图解决的问题。如果你只是试着确保一个直接的链接不会被发布在论坛和其他地方,那么只需检查与.htaccess的引用就足够了。当然,裁判很容易被伪造,所以如果有人这样做的风险是一个问题,那么你就需要做其他的事情。

    如果你需要更安全一点的东西,饼干应该能做到这一点。我们不能只使用PHP会话,因为文件服务器和Web服务器位于不同的框中。但我们可以基于时间散列和一些秘密值创建一个cookie。

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

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

        5
  •  0
  •   Gerrit    16 年前

    我本来打算推荐.htaccess推荐技巧,但这不是一个非常安全的方法。很容易创建一个PHP脚本,添加了一个自定义的HTTP引用。如果您在那里输入下载页面,它会认为您来自该页面。

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

        6
  •  0
  •   Marcelo Cantos    15 年前

    我要用 mod_auth_token 以确保用户具有“最近的链接”。

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