0

有一个 Java 应用程序请求一个页面,我希望阻止它。

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

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

4

2 回答 2

2

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

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

然后我们来到你的问题的主体。

...除了使用会话或 cookie 之外,还有其他方法可以区分来自这个 java 应用程序的请求并阻止它吗?

在这一点上,我假设您正在谈论在服务器端阻塞请求。我应该指出,“坏人”客户端用来发送请求的东西现在已经无关紧要了。(它可以使用URLApache HTTPComponents 或者它可以在汇编代码中实现 HTTP 协议栈!)

所以真正的问题是您有哪些选项可以阻止不需要的请求。答案是:

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

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

于 2012-08-01T03:09:25.950 回答
2

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

会话以两种方式之一进行处理:cookie 或 url 重写。这些与 URL 类几乎没有关系(除了会话 id 被放置在后者的 URL 中)。

用户代理似乎是您最好的选择,缺少一些密码(http 基本、摘要等)或 ssl 证书验证。话虽如此,用户代理完全由客户端自行决定,并且可以很容易地被客户端更改以模拟其他浏览器。

于 2012-08-01T02:20:57.827 回答