使用HTTP_REFERER阻止用户访问站点的内部

时间:2008-08-06 14:44:09

标签: security apache mod-rewrite http-referer

我可以控制HttpServer,但不能控制ApplicationServer或Java应用程序,但是我需要阻止对这些应用程序上某些页面的直接访问。确切地说,我不希望用户自动访问向相应servlet发出直接GET / POST HTTP请求的表单。

所以,我决定根据HTTP_REFERER的值来阻止用户。毕竟,如果用户在网站内导航,它将具有适当的HTTP_REFERER。嗯,这就是我的想法。

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

RewriteEngine on 

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

我希望禁止访问未访问网站的用户,但使用查询字符串向“servlet1”或“servlet2”servlet发出直接GET请求。但我的期望突然终止,因为正则表达式(servlet1|servlet2)/.+\?.+根本没有用。

当我将该表达式更改为(servlet1|servlet2)/.+时,我感到非常失望,并且无论用户是否浏览了网站,我的用户都被阻止了。

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

9 个答案:

答案 0 :(得分:2)

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

首先,我想重复我的想法,并确保我很清楚。你想禁止对servlet1和servlet2的请求是请求没有适当的引用并且确实有一个查询字符串?我不确定我理解(servlet1 | servlet2)/.+ \。还是因为看起来你需要一个servlet1和2下的文件。我想你可能正在将PATH_INFO(在“?”之前)与GET结合起来查询字符串(在“?”之后)。似乎PATH_INFO部分可以工作,但GET查询测试不会。我使用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。但是,您也可以使用path_info和发布数据来提交数据。我使用这个表单来防止使用不正确的referer的三种方法中的任何一种:

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]

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

(顺便说一句,我同意引用阻止是安全性差,但我也理解,有时候,相关性会强制执行不完善和部分解决方案,你似乎已经承认了这一点。)

答案 1 :(得分:1)

我没有解决方案,但我打赌依赖推荐人将永远不会工作,因为用户代理可以完全不发送它或将其欺骗到可以让他们进入的东西。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

Javascript是防止(或至少延迟)屏幕抓取的另一个有用工具。大多数自动抓取工具都没有Javascript解释器,因此您可以执行设置隐藏字段等操作。

编辑:this Phil Haack article的某些内容。

答案 4 :(得分:1)

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

您可以使用CAPTCHA,或设置某种cookie或会话cookie来跟踪用户上次访问的页面(会话将更难以欺骗)并跟踪页面浏览历史记录,并且仅允许用户浏览了要访问要阻止的页面所需的页面。

这显然要求您访问相关应用程序,但这是最简单的方式(不完全,但在我看来“足够好”。)

答案 5 :(得分:0)

我猜你在试图阻止屏幕抓取?

在我的诚实意见中,通过检查HTTP_REFERER的价值来解决并尝试修复是一个艰难的问题。任何打算自动提交作品的人都会精明到足以从他们的“自动机”发送正确的引用者。

您可以尝试限速但不实际修改应用程序以强制进行某种类型的人工验证(CAPTCHA),然后您会发现这很难预防。

答案 6 :(得分:0)

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

使用HTTP_REFERER是不可靠的,因为它是easily faked

另一种选择是检查已知机器人的用户代理字符串(这可能需要修改代码)。

答案 7 :(得分:0)

让事情变得更加清晰:

  1. 是的,我知道使用HTTP_REFERER是完全不可靠的,有些幼稚,但我很确定那些学习(从我这可能?)用Excel VBA进行自动化的人不会知道如何破坏HTTP_REFERER在最佳解决方案的时间跨度内。

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

  3. 根据之前的经验,我知道要求的更改需要两个月的时间才能投入生产。不,把他们折腾成敏捷方法论书在他们的头脑中并没有改善任何东西。

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

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

答案 8 :(得分:0)

您可以使用反CSRF令牌来实现您所追求的目标。

本文更详细地解释了它:Cross-Site Request Forgeries