使用HTTP_REFERER阻止用户访问网站内部

gga*_*asp 5 apache security 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]
Run Code Online (Sandbox Code Playgroud)

我希望禁止访问那些未导航站点但使用查询字符串向“ servlet1”或“ servlet2” servlet发出直接GET请求的用户。但是我的期望突然结束了,因为正则表达式(servlet1|servlet2)/.+\?.+根本不起作用。

当我将表达式更改为时,我真的很失望,(servlet1|servlet2)/.+并且效果如此之好,以至于无论用户是否浏览该网站,我的用户都被阻止了。

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

jj3*_*j33 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]
Run Code Online (Sandbox Code Playgroud)

上面捕获了所有尝试使用查询字符串提交数据的对 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]
Run Code Online (Sandbox Code Playgroud)

根据您尝试开始工作的示例,我认为这就是您想要的:

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

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

(顺便说一句,我同意引用阻塞的安全性很差,但我也理解有时可靠性会迫使解决方案不完美和部分解决方案,您似乎已经承认了这一点。)