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

2024-03-04

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

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

我的代码在以前的 QT 版本中已经运行了很长时间,所以我决定它必须是 QT5 的东西。


我偶然发现 QT5 中添加了以下增强功能:https://bugreports.qt.io/browse/QTBUG-22033 https://bugreports.qt.io/browse/QTBUG-22033

基本上,此增强功能背后的想法是检查钥匙串中的用户名/密码(如果中间代理需要身份验证凭据)。事实证明,这实现得很糟糕,并且此代码已添加到 QNetworkAccessManager::authenticationRequired() 信号中,而不是添加到 proxyAuthenticationRequired() 信号中。

关于这个问题的有趣部分是我没有为我的应用程序或我使用的 QNetworkAccessManager 设置代理。这使得这个问题很难调试!

由于放置不当,任何authenticationRequired 信号都会发生这种“钥匙串查询”。底层的 getProxyAuth() 方法正在使用空白主机名调用“SecKeychainFindInternetPassword”,该主机名与我的钥匙串中的第一个“Internet 密码”匹配,并使用它使用此新凭据向我的服务发送请求。想象一下,当我看到我的其他/个人密码之一被发送到我的 HTTP 服务时,我有多惊讶!

这不仅是一个安全问题,还会导致您的应用程序出现无限循环。我用 QT 打开了一个关于此的错误:https://bugreports.qt.io/browse/QTBUG-30434 https://bugreports.qt.io/browse/QTBUG-30434

有临时解决办法吗?有!我花了一段时间寻找这个问题的解决方法。这是一个令人讨厌的黑客行为。但在 QT 人员做好准备之前,这种方法是有效的。这个黑客之所以有效,是因为它确保“SecKeychainFindInternetPassword”与钥匙串中的任何条目都不匹配,因此跳过“钥匙串查询”。

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

解决方法:

 QNetworkProxy proxy = manager_->proxy();
 proxy.setHostName(" ");
 manager_->setProxy(proxy);

我希望这个问题在 QT 的下一版本中得到解决,这样我就可以删除这个可怕的黑客行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Gradle:如何通过运行 Gradle 4.1 任务通过 eclipse ECJ(JDT 核心)编译 Java

    我有一个可以很好构建的项目日食 欧洲法院 But 甲骨文javac无法构建它 一些原因如链接中所示 ecj和javac的区别 https stackoverflow com questions 3061654 what is the dif
  • C语言中的二维数组如何变成一维数组?

    如果有人可以向我解释以下行为 我将不胜感激 假设我声明一个静态二维数组 float buffer NX NY 现在 如果我想填充这个数组 我注意到可以这样做 initarray buffer NX NY define INITDATAVAL
  • 没有 Redux 的情况下组合Reducer

    我有一个没有 redux 的应用程序 我使用钩子和钩子 useReducer context 处理全局状态 我有 1 个 useReducer 它就像一个 Redux 商店 但要做到这一点我只能发送 1 个减速器 在该减速器中 我拥有所有状
  • 根据数组中的另一个 id 仅对多数组中的第一项进行排序 (PHP)

    我不知道该怎么做 请参阅下面我的数组 我在 while 循环中运行这个数组 需要先找到 attach id 对于每个 topic id 并可以使用 topic id在循环中设置的 正确的输出将是 第一个循环 attach id gt 179
  • 神经网络在一个纪元后趋于平坦

    我正在使用 keras 创建一个卷积神经网络 尝试将图像分类为两个不同的类 并且出于某种原因 在第一个纪元之后 准确性永远不会改变 使用 Keras 后to categorical 我的标签看起来像 0 1 1 0 1 0 0 1 我的模型
  • Amazon SES SMTP Python 用法

    我试图诊断为什么通过 Amazon SES 发送电子邮件无法通过 python 工作 以下示例演示了该问题 其中user and pass设置为适当的凭据 gt gt gt import smtplib gt gt gt s smtplib
  • System.Timers.Timer 与 System.Threading.Timer

    我最近一直在检查一些可能的计时器 并且System Threading Timer https learn microsoft com en us dotnet api system threading timer and System T
  • 即使有标记,pytest-django 也不允许数据库访问

    我很难找出我的设置出了什么问题 我正在尝试测试登录视图 无论我尝试什么 我都会得到 Database access not allowed use the django db mark or the db or transactional
  • 统一处理非托管 API 中的错误代码

    我正在围绕一个相当大的非托管 API 编写一个包装器 几乎每个导入的方法在失败时都会返回一个常见的错误代码 现在 我正在这样做 ErrorCode result Api Method if result ErrorCode SUCCESS
  • Playframework 与 CSRF:“会话中未找到 CSRF 令牌”?

    我正在使用 Playframework 及其内置 CSRF 过滤器和 Security Authenticator 系统制作一个简单的身份验证系统 但我遇到了一个问题 当用户填写登录名 密码并提交输入时 出现以下错误 在会话中找不到 CSR
  • 如何更新 SQL 中游标获取的列

    在进一步讨论之前 是的 我知道与基于集合的操作相比 游标的性能很差 在这种特殊情况下 我在包含 100 条左右记录的临时表上运行游标 并且该临时表始终相当小 因此性能不如灵活性那么重要 我的困难是我无法找到如何更新游标获取的列的示例 以前
  • 在 Git 中运行预提交挂钩。有没有办法验证脚本是否正在运行?

    我想运行 Git 按照博客的建议 我使用了 git init初始化存储库 然后 git在 hooks 目录中存在钩子的位置创建文件夹 然后按照我重命名的脚本的建议pre commit sample as pre commit它不起作用 所以
  • 如何在Qt中保存对话框的状态?

    假设对话框中有复选框 选项等控件 如何在 Qt 中保存对话框的状态 我应该使用 QSettings 还是其他东西 Thanks 我遇到了同样的问题 谷歌搜索并没有太大帮助 所以最后我写了自己的解决方案 我创建了一组函数 用于在创建和销毁时读
  • Keras:为什么损失函数必须为每个批次项返回一个标量,而不仅仅是一个标量?

    我正在 Keras 中编写一个自定义损失函数 但遇到了以下问题 为什么 Keras 损失函数必须为每个批次项返回一个标量 而不是仅返回一个标量 我关心的是整批的累计损失 而不是每件商品的损失 不是吗 我想我已经明白了 fit 有争论samp
  • 更好地理解 C# 泛型

    我查看了一些使用 C 泛型的示例代码 为什么以及何时应该使用它们 所有的例子都很复杂 我需要一个简单 清晰的示例来帮助我开始使用 C 泛型 一个非常简单的例子是通用的List
  • 使用 PHP 5.5 安装 xdebug

    我读了很多答案 但不明白为什么 xdebug 不起作用 php ini xdebug zend extension usr lib php5 20090626 xdebug so php v PHP 5 5 6 1 debphp org p
  • Docker 容器未开始给出“OCI 运行时创建失败”

    我已经安装了Docker版本 https docs docker com release notes 17 12 0 ce 构建 c97c6d6当我尝试启动任何容器时 出现以下错误 docker 来自守护进程的错误响应 OCI运行时创建失败
  • 在像素着色器中计算世界空间坐标

    我有一个像素着色器 我想根据我的世界空间坐标计算每个像素的位置 我该怎么做 我需要什么 我有一个ps input具有 float4 位置的结构 SV POSITION 我认为这很重要 但存储在里面的值似乎有点有趣 我似乎无法弄清楚它们有什么
  • Liferay 连接和压缩 javascript

    我试图弄清楚如何实现所有 js 文件的压缩和缩小 目前我将它们放在一个钩子插件中 html js mycustomjs folder 我知道liferay有自己的机制来压缩javascripts 在barebone jsp或 everyth
  • 在 MacOSX 上,当指定无效的身份验证凭据时,QNetworkAccessManager 会进入无限循环

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