我可以控制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)/.+时,我真的很失望,并且它运行得如此之好,以至于无论用户是否浏览该站点,我的用户都被阻止。

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

===============>>#1 票数: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并通过发布数据来提交数据。 我使用此表单来防止三种方法中的任何一种与不正确的引荐一起使用:

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

我没有解决方案,但我敢打赌,依靠引荐来源网址永远都行不通,因为用户代理可以自由地完全不发送或欺骗它,以免他们进入。

===============>>#3 票数:1

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

===============>>#4 票数:1

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

编辑:类似于Phil Haack这篇文章的内容

===============>>#5 票数:1

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

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

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

===============>>#6 票数:0

您也许可以使用反CSRF令牌来实现自己的目标。

本文将对其进行详细说明: 跨站点请求伪造

===============>>#7 票数:0

我猜您正在尝试防止屏幕刮擦?

坦率地说,要检查并尝试通过检查HTTP_REFERER的值来修复它是一个棘手的难题。 任何想使提交工作自动化的麻烦的人都足够聪明,可以从他们的“自动机”发送正确的引荐来源。

您可以尝试进行速率限制,但无需在实际情况下修改应用程序以在某种程度上强制某种“这是一个人类验证”(CAPTCHA),那么您将发现这很难避免。

===============>>#8 票数:0

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

使用HTTP_REFERER是不可靠的,因为它很容易被伪造

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

===============>>#9 票数:0

为了使事情更加清楚:

  1. 是的,我知道使用HTTP_REFERER完全不可靠并且有些幼稚,但是我很确定,(可能从我这里学到了)用Excel VBA进行自动化的人将不知道如何在一定的时间范围内颠覆HTTP_REFERER最终的解决方案。

  2. 我没有访问/特权来修改应用程序代码。 政治。 你相信吗? 因此,我必须等到版权所有者进行我要求的更改。

  3. 根据以前的经验,我知道请求的更改将需要两个月才能投入生产。 不,向他们扔敏捷方法学书本并没有任何改善。

  4. 这是一个Intranet应用程序。 因此,我没有很多年轻人试图破坏我的声望。 但是我还很年轻,试图破坏“来自印度的非常出色的全球咨询服务”的声誉,但是奇怪的是,那里没有印度人在工作。

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

  ask by ggasp translate from so

未解决问题?本站智能推荐: