我偶然发现了 QT5 中添加的以下增强功能:https ://bugreports.qt.io/browse/QTBUG-22033
基本上,如果中间代理需要身份验证凭据,则此增强操作系统背后的想法是检查用户名/密码的钥匙串。事实证明这是很糟糕的实现,并且此代码已添加到 QNetworkAccessManager::authenticationRequired() 信号中,而不是添加到 proxyAuthenticationRequired() 信号中。
关于这个问题的有趣部分是我没有为我的应用程序或我使用的 QNetworkAccessManager 设置代理。这使得这个问题很难调试!
由于放置不当,这种“钥匙串查询”发生在任何 authenticationRequired 信号中。底层的 getProxyAuth() 方法使用空白主机名调用“SecKeychainFindInternetPassword”,该主机名与我的钥匙串中的第一个“Internet 密码”匹配,并使用它向我的服务发送带有这个新凭据的请求。想象一下,当我看到我的其他/个人密码之一被发送到我的 HTTP 服务时,我会感到惊讶!
这不仅是一个安全问题,而且会导致您的应用程序出现无限循环。我用 QT 打开了一个关于这个的错误:https ://bugreports.qt.io/browse/QTBUG-30434
有临时解决办法吗?有!我一直在寻找解决此问题的方法。这是一个讨厌的黑客。但它一直有效,直到 QT 家伙连续获得他们的鸭子。这个 hack 之所以有效,是因为它确保“SecKeychainFindInternetPassword”与钥匙串中的任何条目都不匹配,因此跳过了“钥匙串查询”。
基本上我将代理主机名设置为“”而不是“”,这将防止任何导致我的应用程序中出现无限循环的匹配。
解决方法:
QNetworkProxy proxy = manager_->proxy();
proxy.setHostName(" ");
manager_->setProxy(proxy);
我希望这在 QT 的下一个版本中得到解决,这样我就可以删除这个可怕的 hack。