Apache HttpClient,User-Agent和公司代理

时间:2012-12-01 22:45:21

标签: java proxy user-agent apache-httpclient-4.x apache-httpcomponents

这在某种程度上是一个推测性的问题,因为答案在我可用的信息中可能并不明显,但我希望有经验的人能够根据公司代理的常见做法认识到可能的答案。

我在公司代理背后工作(不是作为软件开发人员)。在业余时间,我正在搞乱我正在开发的Java程序。这个程序需要做一些非常简单的HTTP GET请求,我正在使用Apache HttpClient。我最初担心的是我是否通过代理服务器实现了这一点。在我们的Web浏览器中,代理服务器很容易输入网络设置......无需身份验证。所以,我在Java程序中添加了以下内容:

myClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, MY_PROXY);

果然,它奏效了!但是,我有另一个担忧。来自我的程序的HTTP请求可能已经指定了一些奇怪的User-Agent(我已经确认了这种情况),并且我不希望它们在自动或手动数据包检查中引发任何形式的怀疑。所以我对自己说,“为什么不将User-Agent标头设置为与这台机器上的浏览器相同?”

myClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT, BROWSER_AGENT);

这是奇怪的地方。如果上面的BROWSER_AGENT字符串设置为完全与我的计算机上的公司提供的浏览器(IE或FF)相同的值,则会出现“身份验证失败,缺少凭据”类型错误从公司代理服务器返回的消息。但是,如果我将User-Agent标头设置为通用的,比如说Mozilla 5.0,甚至是一个完全虚假的字符串,甚至是字符串,那么一切正常!困扰我的部分是:

  • 当User-Agent设置为与我的浏览器相同(一个很长的复杂字符串)时,我会以某种方式“失败身份验证”,这没有任何意义,因为在真实的浏览器中我没有提供任何身份验证信息(除非它来自某些pre安装的证书可能吗?)
  • 如果公司要求对端口80上发送到代理服务器的任何请求进行身份验证,那么他们为什么要让随机的User-Agent字符串通过?监督?我无法理解的其他一些原因?

希望这个问题不太过于推测,不能被视为具有建设性。我很想听听在这方面有经验的人。感谢。

1 个答案:

答案 0 :(得分:3)

默认情况下,HTTPClient将自己标识为用户代理。如您所见,您可以将其覆盖为您想要的任何字符串。

您的代理服务器看起来像是根据浏览器类型自动添加用户凭据,但是由于发现了一些异常,您的管理员添加了一个例外规则,即,当用户代理未知时,请让它通过。就个人而言,我认为这是一个非常糟糕的安全策略,因为您发现,所有程序只需使用伪造的用户代理就可以通过您的代理而无需身份验证。