Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MacOSX上,当指定无效的身份验证凭据时,QNetworkAccessManager进入无限循环_Macos_Qt_Qt5_Qnetworkaccessmanager - Fatal编程技术网

在MacOSX上,当指定无效的身份验证凭据时,QNetworkAccessManager进入无限循环

在MacOSX上,当指定无效的身份验证凭据时,QNetworkAccessManager进入无限循环,macos,qt,qt5,qnetworkaccessmanager,Macos,Qt,Qt5,Qnetworkaccessmanager,在我的跨平台应用程序中,我使用QNetworkAccessManager向需要身份验证的HTTP服务发送HTTP请求。我最近升级到了QT5,令我在MacOSX上完全惊讶的是,在某些情况下,我的应用程序会以尽可能快的速度向我的服务发送大量请求 在进行了一些调试之后,结果表明,只有当我在请求中指定了错误的身份验证凭据时,才会发生这种情况。如果在我的HTTP请求中指定了无效的用户名/密码,QNetworkAccessManager将无限期地向我的服务重新发送请求 我的代码在以前的QT版本中已经运行了很

在我的跨平台应用程序中,我使用QNetworkAccessManager向需要身份验证的HTTP服务发送HTTP请求。我最近升级到了QT5,令我在MacOSX上完全惊讶的是,在某些情况下,我的应用程序会以尽可能快的速度向我的服务发送大量请求

在进行了一些调试之后,结果表明,只有当我在请求中指定了错误的身份验证凭据时,才会发生这种情况。如果在我的HTTP请求中指定了无效的用户名/密码,QNetworkAccessManager将无限期地向我的服务重新发送请求


我的代码在以前的QT版本中已经运行了很长时间,所以我决定它必须与QT5配合使用

我偶然发现QT5中添加了以下增强功能:

基本上,如果中间代理需要身份验证凭据,则此增强操作系统背后的想法是检查密钥链中的用户名/密码。事实证明,这是一个错误的实现,并且该代码已添加到QNetworkAccessManager::authenticationRequired()信号中,而不是添加到proxyAuthenticationRequired()信号中

这个问题的有趣之处在于,我没有为我的应用程序设置代理,也没有为我使用的QNetworkAccessManager设置代理。这使得这个问题很难调试

由于位置不正确,这种“钥匙链查询”是在任何authenticationRequired信号的情况下发生的。基础getProxyAuth()方法正在调用主机名为空的“SecKeychainFindInternetPassword”,该主机名与我的keychain中的第一个“Internet密码”匹配,并使用它向我的服务发送一个具有此新凭据的请求。想象一下,当我看到我的另一个/个人密码被发送到我的HTTP服务时,我会有多么惊讶

这不仅是一个安全问题,而且会在应用程序中造成无限循环。我在QT上打开了一个关于此的bug:

有临时解决办法吗?有!我找了一段时间来解决这个问题。这是一个令人讨厌的黑客行为。但在QT的人把他们的鸭子排成一行之前,它是有效的。这种攻击之所以有效,是因为它确保了“SecKeychainFindInternetPassword”与密钥链中的任何条目都不匹配,因此跳过了“密钥链查询”

基本上,我将代理主机名设置为“”,而不是“”,这将阻止在我的应用程序中出现任何导致infite循环的匹配

解决方法:

 QNetworkProxy proxy = manager_->proxy();
 proxy.setHostName(" ");
 manager_->setProxy(proxy);
我希望在下一版本的QT中解决这个问题,这样我就可以删除这个可怕的黑客