3

这是一个有点推测性的问题,因为答案可能并不明显,但我希望有足够经验的人会认识到可能的答案关于公司代理的常见做法。Apache HttpClient,用户代理和公司代理

我在公司代理的后面工作(不是软件开发人员)。在业余时间,我正在搞一个正在开发的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甚至是完全虚假的字符串,或者甚至是空的字符串,它都可以正常工作!这让我困惑的部分是:

  • 当用户代理设置成一样的我的浏览器(长而复杂的字符串),I“验证失败”不知何故,这是没有意义的,因为在真正的浏览器我提供没有认证信息(除非它来自一些预先安装的证书可能?)
  • 如果公司需要对在端口80上发送到代理服务器的任何请求进行认证,那么他们如何让随机的用户代理字符串通过?监督?我无法理解的其他原因?

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

+2

可能当它看到一些真正的浏览器时,它会尝试一些透明的身份验证,例如ntlm。而且由于并非所有软件都支持它,可能是您的系统管理员决定让所有不支持ntlm的请求通过。 – kenota

回答

3

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

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