代码之家  ›  专栏  ›  技术社区  ›  ggasp

使用HTTP引用阻止用户访问站点内部

  •  4
  • ggasp  · 技术社区  · 16 年前

    我已经控制了HTTPServer,但不在Apple Server或Java应用程序上,但我需要阻止对这些应用程序的某些页面的直接访问。准确地说,我不希望用户自动访问向适当的servlet发出直接get/post http请求的表单。

    因此,我决定根据 HTTP_REFERER . 毕竟,如果用户在站点内导航,它将有一个适当的 HTTP-引用器 . 我就是这么想的。

    我在.htaccess文件中实现了一个重写规则,它说:

    RewriteEngine on 
    
    # Options +FollowSymlinks
    RewriteCond %{HTTP_REFERER} !^http://mywebaddress(.cl)?/.* [NC]
    RewriteRule (servlet1|servlet2)/.+\?.+ - [F]
    

    我希望禁止访问没有导航该站点但使用querystrings直接向“servlet1”或“servlet2”servlets发出get请求的用户。但是我的期望突然结束,因为正则表达式 (servlet1|servlet2)/.+\?.+ 根本没用。

    当我把那个表情改成 (servlet1|servlet2)/.+ 而且它运行得非常好,以至于我的用户被阻止,不管他们是否浏览了这个网站。

    所以,我的问题是:如果我没有权限/特权/时间修改应用程序,我如何才能完成不允许“机器人”直接访问某些页面的任务?

    9 回复  |  直到 10 年前
        1
  •  2
  •   jj33    16 年前

    我不确定我是否能一次解决这个问题,但我们可以根据需要来来回回。

    首先,我想重复一下你说的话,确保我说的清楚。你想拒绝对servlet1的请求,servlet2是请求没有合适的引用者,它 有查询字符串吗?我不确定我是否理解(servlet1 servlet2)/.+\?.+因为看起来您需要servlet1和2下的文件。我想你可能正在合并路径信息(在“?”之前)使用get查询字符串(在“?”之后)。路径信息部分似乎可以工作,但get query测试将无法工作。我使用script1.cgi和script2.cgi在我的服务器上做了一个快速测试,下面的规则可以满足您的要求。很明显,它们被编辑了一点以适应我的环境:

    RewriteCond %{HTTP_REFERER} !^http://(www.)?example.(com|org) [NC]
    RewriteCond %{QUERY_STRING} ^.+$
    RewriteRule ^(script1|script2)\.cgi - [F]
    

    上面捕获了所有对script1.cgi和script2.cgi的错误引用请求,这些请求试图使用查询字符串提交数据。但是,您也可以使用路径信息和发布数据来提交数据。我用这个表格来保护自己不被错误引用的三种方法中的任何一种使用:

    RewriteCond %{HTTP_REFERER} !^http://(www.)?example.(com|org) [NC]
    RewriteCond %{QUERY_STRING} ^.+$ [OR]
    RewriteCond %{REQUEST_METHOD} ^POST$ [OR]
    RewriteCond %{PATH_INFO} ^.+$
    RewriteRule ^(script1|script2)\.cgi - [F]
    

    基于您尝试工作的例子,我认为这是您想要的:

    RewriteCond %{HTTP_REFERER} !^http://mywebaddress(.cl)?/.* [NC]
    RewriteCond %{QUERY_STRING} ^.+$ [OR]
    RewriteCond %{REQUEST_METHOD} ^POST$ [OR]
    RewriteCond %{PATH_INFO} ^.+$
    RewriteRule (servlet1|servlet2)\b - [F]
    

    希望这至少能让你更接近你的目标。请告诉我们它是如何工作的,我对你的问题很感兴趣。

    (顺便说一句,我同意引用阻塞的安全性很差,但我也理解,关系有时会迫使不完善和局部的解决方案,这似乎您已经认识到了。)

        2
  •  1
  •   Rytmis    16 年前

    我没有解决方案,但我敢打赌,依赖于引用者永远不会起作用,因为用户代理可以自由地根本不发送它,或者欺骗它,让他们进来。

        3
  •  1
  •   Michiel de Mare    16 年前

    不能通过用户的HTTP请求来区分用户和恶意脚本。但是,您可以在太短的时间内分析哪些用户请求的页面太多,并阻止他们的IP地址。

        4
  •  1
  •   Dan Herbert    16 年前

    作为一种验证方法,使用引用者是非常不可靠的。正如其他人提到的,它很容易被欺骗。您最好的解决方案是修改应用程序(如果可以的话)

    您可以使用验证码,或者设置某种类型的cookie或会话cookie,以跟踪用户上次访问的页面(会话很难被欺骗),并跟踪页面视图历史记录,并且只允许浏览过所需页面的用户访问要阻止的页面。

    这显然需要您访问相关的应用程序,但是这是最简单的方法(我认为不是完全的,但“足够好”)。

        5
  •  1
  •   Chris Benard Mafoo    16 年前

    javascript是另一个防止(或至少延迟)屏幕抓取的有用工具。大多数自动化的刮削工具没有JavaScript解释器,所以您可以做一些事情,比如设置隐藏字段等。

    编辑:沿着 this Phil Haack article .

        6
  •  0
  •   erlando    16 年前

    我猜你是想阻止屏幕刮擦?

    老实说,这是一个很难解决的问题,并试图通过检查http-referer的值来修复,这只是一个粘贴石膏。任何人去麻烦自动化提交将是明智的足够发送正确的推荐人从他们的“自动”。

    你可以尝试速率限制,但不需要修改应用程序来强制某种“是-这-人-验证”(验证码),那么你会发现这很难预防。

        7
  •  0
  •   Seibar    16 年前

    如果您试图阻止搜索引擎机器人访问某些页面,请确保使用的是格式正确的 robots.txt 文件。

    使用HTTP引用是不可靠的,因为它是 easily faked .

    另一个选项是检查用户代理字符串中是否存在已知的机器人程序(这可能需要修改代码)。

        8
  •  0
  •   ggasp    16 年前

    让事情更清楚一点:

    1. 是的,我知道使用http-referer是完全不可靠的,而且有点幼稚,但是我很确定那些(也许是从我那里)学习的人。要使用Excel实现自动化,VBA将不知道如何在时间范围内破坏HTTP引用以获得最终解决方案。

    2. 我没有权限修改应用程序代码。政治。你相信吗?所以,我必须等到权利持有人做出我要求的更改。

    3. 根据以往的经验,我知道所要求的更改需要两个月才能投入生产。不,把敏捷方法学的书扔到他们的脑子里并没有改善任何事情。

    4. 这是一个内部网应用程序。所以我没有多少年轻人试图破坏我的威望。但我年轻得足以破坏“一个来自印度的非常昂贵的全球咨询服务”的声誉,但奇怪的是,在那里没有一个印度人在工作。

    到目前为止,最好的答案来自“Michel de Mare”:基于IP阻止用户。我昨天做的。今天我想做一些更通用的东西,因为我有很多袋鼠用户(从一个IP地址跳到另一个),因为他们使用VPN或DHCP。

        9
  •  0
  •   Ian Oxley    12 年前

    你可以使用一个反CSRF令牌来实现你想要的。

    本文对此进行了更详细的解释: Cross-Site Request Forgeries