2012-08-01 117 views
0

有一个Java应用程序请求一个页面,我想阻止它。如何从Web应用程序阻止特定的客户端?

我认为这样做的一种方式是使用会话或cookie,但我不确定Java URL方法是否可以处理它们。

除了使用会话或cookie之外,是否还有另一种方法可以区分来自此Java应用程序的请求并阻止它?我知道它有一个独特的Java用户代理标题,但我希望更准确。

+2

URL()与会话或cookie有什么关系? – 2012-08-01 02:14:12

+0

所以你说Java应用程序正在访问你的网站,你想阻止它? – 2012-08-01 02:15:18

+0

是的。那么,我想跟踪它所提出的要求。我将通过发送404头来完成。由于真正的客户端(mozilla,chrome等)永远不会404,我会知道哪个是java bot,哪个不是。 – SHH 2012-08-01 02:20:25

回答

2

标题问题的答案是URL.openXxx方法不理解Cookie。

(如果您的服务器配置为接受请求URL本身的会话令牌,该URL.openXxx方法不会碍事。但是,这种做法是不安全的。)

然后我们来的身体你的问题。

......除了使用会话或cookie之外,还有另一种方法可以区分来自此Java应用程序的请求并阻止它?

在这一点上,我假设你正在讨论阻塞服务器端的请求。我应该指出,“坏人”客户端用来发送请求的现在是immaterial。 (它可以使用URL或Apache HTTPComponents,或者它可以在汇编代码中实现HTTP协议栈!)

所以真正的问题是你有什么选择来阻止不需要的请求。答案是:

  • 您可以基于请求URL本身进行阻止,但这可能会适得其反。
  • 您可以根据请求标头中会话(或其他)cookie的存在进行阻止。这是进行访问控制的正常方式,并且假设您安全地发布和处理cookie,这很难被打败。
  • 您可能需要在请求URL中传递会话令牌,但这存在根本的安全问题。
  • 你可以依赖其他“信息丰富”的标题......比如用户代理标题,但这是微不足道的。
  • 您可以根据请求源IP地址阻止,但所有坏人需要做的是发送来自不同IP地址的请求。
  • 您可以通过SSL/TLS上的HTTP使用客户端证书来限制访问,但这意味着您必须管理所有合法客户端主机的证书,这在大多数环境中都存在问题。

总之,cookie是最好的解决方案,所以“好人”客户端应用程序需要使用能够进行cookie管理并在请求中设置cookie的库。

2

URL只是您尝试与之交谈的服务器的代表。它有一些方便的方法来打开连接等等,但就是这样。

会话以两种方式之一处理:cookie或url重写。这些与URL类很少或根本没有关系(除了后者中的会话ID被放置在URL中)。

用户代理似乎是你最好的选择,缺少一些密码(http basic,digest等等)或ssl证书验证。也就是说,用户代理完全由客户端自行决定,客户端可以很容易地更改其模拟其他浏览器。