5

我可以控制 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)/.+而且效果如此之好,以至于我的用户无论是否浏览该网站都会被屏蔽。

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

4

9 回答 9

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]

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

(顺便说一句,我同意引用阻止是很差的安全性,但我也明白,relaity 有时会迫使解决方案不完美和部分,你似乎已经承认了。)

于 2008-08-06T18:41:13.057 回答
1

我没有解决方案,但我敢打赌,依赖引荐来源网址永远不会奏效,因为用户代理可以完全不发送它或将其欺骗到可以让他们进入的东西上。

于 2008-08-06T14:49:13.073 回答
1

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

于 2008-08-06T15:02:26.587 回答
1

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

编辑:与此 Phil Haack 文章类似的内容。

于 2008-08-06T15:03:37.397 回答
1

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

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

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

于 2008-08-06T15:08:30.913 回答
0

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

老实说,这是一个很难解决的问题,并且试图通过检查 HTTP_REFERER 的值来解决它只是一个贴膏药。任何去自动化提交的麻烦的人都会足够精明地从他们的“自动机”发送正确的推荐人。

您可以尝试限制速率,但无需实际修改应用程序以在某些时候强制进行某种“这是人类的验证”(CAPTCHA),那么您会发现这很难防止。

于 2008-08-06T15:00:15.780 回答
0

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

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

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

于 2008-08-06T15:32:11.113 回答
0

为了让事情更清楚一点:

  1. 是的,我知道使用 HTTP_REFERER 是完全不可靠的,而且有点幼稚,但我很确定那些学会(可能是从我身上)使用 Excel VBA 进行自动化的人将不知道如何在时间跨度内颠覆 HTTP_REFERER最终的解决方案。

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

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

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

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

于 2008-08-06T15:58:14.790 回答
0

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

这篇文章更详细地解释了它:Cross-Site Request Forgeries

于 2008-08-20T13:06:48.730 回答