3

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

我在公司代理背后工作(不是作为软件开发人员)。在业余时间,我正在玩弄我正在开发的 Java 程序。该程序需要发出一些非常简单的 HTTP GET 请求,为此我使用了 Apache HttpClient。起初我担心我是否会通过代理服务器。在我们的网络浏览器中,代理服务器可以简单地输入到网络设置中……不需要身份验证。因此,我在我的 Java 程序中添加了以下内容:

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

果然,成功了!然而,我还有另一个顾虑。来自我的程序的 HTTP 请求可能指定了一些奇怪的用户代理(我已经确认是这种情况),我不希望它们在自动或手动数据包检查中引发任何怀疑。于是我对自己说,“为什么不直接把 User-Agent 头设置成和本机的浏览器一样呢?”

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

这就是奇怪的地方。如果BROWSER_AGENT上面的字符串设置为与我机器上公司提供的浏览器(IE 或 FF)完全相同的值,我会收到从公司代理服务器返回的“身份验证失败,缺少凭据”类型的错误消息。但是,如果我将 User-Agent 标头设置为通用的,比如说Mozilla 5.0,甚至是一个完全伪造的字符串,甚至是一个字符串,它都可以正常工作!让我困惑的部分是:

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

希望这个问题不会太投机而不能被认为是建设性的。我很想听听有这方面经验的人的意见。谢谢。

4

1 回答 1

3

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

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

于 2012-12-03T06:04:14.533 回答