【问题标题】:How to prevent deep linking to files on my website如何防止深度链接到我网站上的文件
【发布时间】:2010-09-28 13:04:41
【问题描述】:

我拥有一个网站,其中包含许多可供下载的免费软件。我面临的问题是来自世界各地的人们正在使用直接链接 文件(例如 .zip 文件)并将它们发布在他们的网站和一般论坛上。我得到了大量的带宽,这没关系,但是访问的页面数量很少。有没有一种方法或脚本可以添加到链接中,这样当有人按下来自外国网站的链接时,会打开我网站的页面,然后让他下载文件,以便我获得更多访问。

例如,这是我网站上的地址:

http://sy-stu.org/stu/PublicFiles/StdLibrary/Exam.zip

当有人按下它时,它将直接开始下载过程。

【问题讨论】:

    标签: html hyperlink download


    【解决方案1】:

    您的站点由 Apache Web 服务器托管,因此您应该能够在站点的 httpd.conf(或虚拟主机块)中执行以下操作

    RewriteEngine On
    RewriteCond   %{HTTP_REFERER} !^$
    RewriteCond   %{HTTP_REFERER} !^http://(www\.)?yourdomain\.com/  [NC]
    RewriteRule   ^/PublicFiles/  /page-about-direct-links.html
    

    这基本上是在说:

    1. 打开 mod_rewrite 引擎
    2. 如果 HTTP Referrer 不为空……
    3. 并且不包含我的域名(带或不带“www.”)...
    4. 将对 /PublicFiles/ 下的任何内容的任何请求重定向到 /page-about-direct-links.html

    更多关于 mod_rewrite 的信息可以在这里找到:mod_rewrite - Apache HTTP Server

    【讨论】:

    • “你是网站”基本上是在说“你是网站”。
    • 谢谢。我想我最初写的是“你正在运行 Apache...”,但不想假设他正在运行自己的服务器。
    • 那里,我为你修正了你的逻辑:) RewriteCond 默认(这里需要)是用 and 组合条件,! 表示以下表达式not 匹配。我还优化了你的表达方式,因为我认为你的意思是。
    【解决方案2】:

    如果您使用的是 PHP,您可以有一个脚本将用户链接到下载,但前提是 $_SERVER['HTTP_REFERER'] 来自您的站点。如果不是,您将重定向到您的网站。

    【讨论】:

    • HTTP_REFERER 根据我的经验并不总是可靠的。检查您的网络服务器日志,看看您是否为足够多的受众设置了引荐来源。
    • 我认为在firefox中也有一种方法可以更改引荐来源网址。好吧,不是很多人这样做,但仍然值得一提..
    • @kinan 我找到了一个脚本,因为它具有热链接保护功能。 zubrag.com/scripts/download.php希望对您有所帮助。
    • 还有一些用于 Firefox(及其他)的隐私插件,可以修改/伪造引用者。如果请求带有无效的referer,则禁止该请求,但如果它没有referer,则应允许它。
    【解决方案3】:

    请勿提供指向您正在提供的文件的直接链接。提供一个脚本,在您点击提交按钮后通过该脚本发送内容。

    进行网络搜索以通过 cgi 发送文件。

    这是我在网上找到的一个简洁的链接: here

    【讨论】:

      【解决方案4】:

      为什么不只是让链接动态和间接,例如:

      在第 X 页:(静态)

      <a href="Y">SuperNeat Program</a>
      

      在 Y 页上:(动态生成)

      Click here to download 
      <a href="Z.php?timestamp={timestamp}&counter={counter}&hash={hash}">
      SuperNeat Program</a>
      

      并用自 1970 年以来的当前时间(以毫秒为单位)替换时间戳,计数器 = 每次下载时递增一次的计数器,哈希 = 连接的 MD5 哈希(时间戳,计数器,秘密盐)其中秘密盐 = 您保留的任何喜欢的代码秘密。

      然后在 Z.php 页面上,您只需根据查询字符串中的计数器和时间戳重新计算哈希值,检查它是否与查询字符串中的哈希值匹配,并且时间戳是最近的(例如,从前 30 分钟或60分钟或其他)。如果是,则提供有问题的文件。如果不是,则抛出错误消息。这使某人只有很短的时间可以直接链接到您的文件。如果您甚至不想这样做,请跟踪 Z.php 查询字符串中收到的计数器值,并且不要多次接受它们。

      【讨论】:

        【解决方案5】:

        我根本不是网络专家,但我正在考虑以下指针 -

        如果您使用的是 asp.net,可以 http 处理程序或在网站级别配置的模块提供帮助(有关网络上的大量信息,我最近查找了一些工作,这里有一个 article 例如。

        这个想法是在请求到达目标文件之前拦截请求并将其重定向到您希望显示的页面;例如 - 如果有人希望浏览到您发布的 url ("http://sy-stu.org/stu/PublicFiles/StdLibrary/Exam.zip") 拦截此调用,使用一些查找来找到您希望显示的页面并将请求重定向到那里;我猜用户关注链接不会太烦人(除非他们已经“将目标另存为”,这将导致他们保存一些 HTML 而不是 ZIP)。

        但是,我的计划中存在一些“漏洞”——您如何实际提供可在您自己的页面上使用的链接?我相信您可以区分来自您网站的请求和来自其他网站的请求,您可以通过检查请求对象来检查处理程序/模块。

        【讨论】:

          猜你喜欢
          • 2011-10-05
          • 2016-05-09
          • 2021-02-22
          • 1970-01-01
          • 1970-01-01
          • 2011-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多