Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
使用 pytest-mask-secrets 保护测试机密_创想鸟

使用 pytest-mask-secrets 保护测试机密

使用 pytest-mask-secrets 保护测试机密

保持敏感数据的安全和私密是软件开发的首要任务。应用程序日志是常见的泄漏媒介之一,受到仔细保护,以防止出现秘密。同样的担忧和风险也适用于测试日志,它可能会泄露密码或访问令牌。运行 ci 工作流程的工具通常提供一种机制,可以轻松屏蔽日志中的敏感数据。虽然这非常方便、高效且易于使用,但在某些情况下,这可能还不够。

为什么仅 ci 工作流屏蔽可能还不够

例如,github actions 在处理机密方面做得很好。工作流程中定义的任何秘密都会自动从捕获的输出中屏蔽掉,这就像一个魅力。然而,与任何 ci 系统一样,它也有其局限性。如果输出报告采用不同的路径(例如保存到文件、生成 junit 或发送到远程日志存储),github actions 无法检查内容并掩盖机密。

此外,测试并不总是在 ci 工作流程中运行,即使如此,秘密可能仍然需要隐藏。想象一下您正在本地运行测试并共享日志来讨论问题。在没有意识到的情况下,您在访问令牌中包含了一个 url。

因此,拥有一种处理测试日志中敏感数据的机制在各个层面都是至关重要的。最好的方法是直接在测试级别或测试框架本身内实现这一点。这可以确保秘密不会从主要来源泄漏,从而防止它们通过系统向上传递。

在适当的级别增加保护

直接在测试中维护秘密屏蔽可能成本相对较高且容易出错,而且常常感觉像是一场失败的战斗。例如,假设您需要设计一个以令牌作为参数的 url。与日志中的存在相比,此 url 必须以不同的方式呈现才能在请求中使用。

相比之下,在测试框架内拦截报告生成提供了一个理想的机会来挂钩流程并修改记录以消除敏感数据。这种方法对测试是透明的,不需要修改测试代码,并且其功能就像 ci 工作流程中的秘密屏蔽功能一样 — 只需运行它,而无需管理秘密。它使该过程自动化,确保敏感数据受到保护,而不会给测试设置增加额外的复杂性。

这正是 pytest-mask-secrets 所做的,显然当 pytest 用于测试执行时。在其众多功能中,pytest 提供了丰富且灵活的插件系统。为此,它允许您在生成任何日志之前、在所有数据都已收集完毕时挂接到该进程。这使得在输出记录之前可以轻松搜索并删除记录中的敏感值。

进行测试:实用演示

为了说明这是如何工作的,一个简单的例子将是最有效的。下面是一个简单的测试,可能不代表真实世界的测试场景,但可以很好地演示 pytest-mask-secrets。

import loggingimport osdef test_password_length():    password = os.environ["password"]    logging.info("tested password: %s", password)    assert len(password) > 18

在此示例中,有一个断言可能会失败(而且确实会失败),以及一条包含秘密的日志消息。是的,在日志中包含秘密可能看起来很愚蠢,但请考虑这样一个场景:您有一个带有令牌作为参数的 url,并且启用了详细的调试日志记录。在这种情况下,像 requests 这样的库可能会无意中以这种方式记录秘密。

现在进行测试。首先,设置测试所需的秘密:

(venv) $ export password="top-secret"

接下来,运行测试:

(venv) $ pytest --log-level=info test.py ============================= test session starts ==============================platform linux -- python 3.12.4, pytest-8.3.2, pluggy-1.5.0rootdir: /tmp/tmp.avztz7nhzscollected 1 item                                                               test.py f                                                                [100%]=================================== failures ===================================_____________________________ test_password_length _____________________________    def test_password_length():        password = os.environ["password"]        logging.info("tested password: %s", password)>       assert len(password) > 18e       assertionerror: assert 10 > 18e        +  where 10 = len('top-secret')test.py:8: assertionerror------------------------------ captured log call -------------------------------info     root:test.py:7 tested password: top-secret=========================== short test summary info ============================failed test.py::test_password_length - assertionerror: assert 10 > 18============================== 1 failed in 0.03s ===============================

默认情况下,秘密值在输出中出现两次:一次在捕获的日志消息中,另一次在失败的断言中。

但是如果安装了 pytest-mask-secrets 会怎么样?

(venv) $ pip install pytest-mask-secrets

并进行相应配置。它需要知道保存秘密的环境变量列表。这是通过设置 mask_secrets 变量来完成的:

(venv) $ export mask_secrets=password

现在,重新运行测试:

(venv) $ pytest --log-level=info test.py ============================= test session starts ==============================platform linux -- Python 3.12.4, pytest-8.3.2, pluggy-1.5.0rootdir: /tmp/tmp.AvZtz7nHZSplugins: mask-secrets-1.2.0collected 1 item                                                               test.py F                                                                [100%]=================================== FAILURES ===================================_____________________________ test_password_length _____________________________    def test_password_length():        password = os.environ["PASSWORD"]        logging.info("Tested password: %s", password)>       assert len(password) > 18E       AssertionError: assert 10 > 18E        +  where 10 = len('*****')test.py:8: AssertionError------------------------------ Captured log call -------------------------------INFO     root:test.py:7 Tested password: *****=========================== short test summary info ============================FAILED test.py::test_password_length - AssertionError: assert 10 > 18============================== 1 failed in 0.02s ===============================

现在,在打印秘密的地方会出现星号,而不是秘密值。工作已完成,测试报告现已不含敏感数据。

结束语

从这个例子来看,pytest-mask-secrets 似乎并没有比 github actions 默认情况下所做的更多,这使得这项工作显得多余。然而,如前所述,ci 工作流执行工具仅掩盖捕获的输出中的秘密,而使 junit 文件和其他报告保持不变。如果没有 pytest-mask-secrets,敏感数据仍然可能会在这些文件中暴露——这适用于 pytest 生成的任何报告。另一方面,当使用 log_cli 选项时,pytest-mask-secrets 不会屏蔽直接输出,因此 ci 工作流程的屏蔽功能仍然有用。通常最好结合使用这两种工具来确保敏感数据的保护。

就是这样。感谢您花时间阅读这篇文章。我希望它为使用 pytest-mask-secrets 来增强测试过程的安全性提供了宝贵的见解。

测试快乐!

以上就是使用 pytest-mask-secrets 保护测试机密的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1348875.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
BiRefNet 最先进的最新最好的背景批量删除应用程序
上一篇 2025年12月13日 12:24:34
如何为初学者使用 Python 创建“猜数字”游戏
下一篇 2025年12月13日 12:24:49

相关推荐

  • 为什么某些外设需要安装特定驱动才能全功能使用?

    外设需专用驱动因通用驱动仅支持基础功能,无法解析厂商私有协议,导致高级特性如自定义按键、RGB灯效、DPI调节等无法使用,且性能优化不足,影响体验。 某些外设需要安装特定驱动才能全功能使用,核心原因在于操作系统自带的通用驱动只能提供最基础的“即插即用”功能,而外设制造商为了充分发挥其硬件的独特性能、…

    2026年9月23日
    000
  • Linux sudoers文件配置方法

    使用visudo编辑sudoers文件可安全配置用户权限,避免语法错误。通过用户、主机、命令别名简化管理,合理分配无需密码或特定命令权限,禁止赋予shell类命令无限制权限,并将规则写入/etc/sudoers.d/目录便于维护,配置后需测试并备份以防出错。 sudoers 文件用于配置 Linux…

    2026年9月23日
    100
  • linux .zip文件 解压缩命令的简单使用

    linux .zip文件 解压缩命令的简单使用linux .zip文件 解压缩命令的简单使用linux .zip文件 解压缩命令的简单使用linux .zip文件 解压缩命令的简单使用

    大家好,很高兴再次与大家见面,我是你们的老朋友全栈君。 在Windows系统下,常见的压缩格式包括.zip和.rar。而在Linux系统下,常见的压缩格式则有.zip、.gz、.bz2、.tar.gz和.tar.bz2。今天,我将简要介绍一下Linux系统下.zip压缩命令的使用方法。 .zip的使…

    2026年9月23日 • 用户投稿
    300
  • VS Code算法实战:竞赛编程与调试环境搭建

    首先安装编程语言环境及VS Code扩展,如C/C++、Code Runner和LeetCode;接着配置Code Runner支持编译运行与输入重定向;最后通过代码片段提升编码速度,形成高效竞赛开发环境。 在竞赛编程中,高效的开发环境能大幅提升编码速度与调试效率。VS Code凭借轻量、可扩展和强…

    2026年9月23日
    000
  • VSCode如何设置代码自动补全触发 VSCode智能提示触发条件的优化

    要解决vscode代码自动补全的触发、准确性、禁用和速度问题,需按以下步骤操作:1. 调整editor.quicksuggestions控制提示触发条件,如设置”other”: true, “comments”: false, “strin…

    2026年9月23日
    200
  • 解决 Conda 环境中 Java 版本冲突的策略

    本文旨在解决 Conda 环境中 Java 版本激活不正确的问题。当用户尝试在 Conda 环境中指定特定 Java 版本(如 OpenJDK 8)时,系统可能仍激活旧的或错误的 Java 版本。教程将详细分析问题根源,并提供一种通过精确指定 Java 包名来确保 Conda 环境正确管理 Java…

    2026年9月23日
    000
  • Django 项目运行时遇到“django.core.exceptions.ImproperlyConfigured”错误,如何解决?

    当在运行 Django 项目时遇到“django.core.exceptions.ImproperlyConfigured”错误时,这表明 Django 无法导入其预期的数据库后端。 在给定的代码中,错误消息指出 Django 无法导入“django.db.backends.mysql”,这可能是因…

    2026年9月23日
    000
  • Linux安装Redis数据库,无需公网IP实现远程连接

    Linux安装Redis数据库,无需公网IP实现远程连接Linux安装Redis数据库,无需公网IP实现远程连接Linux安装Redis数据库,无需公网IP实现远程连接Linux安装Redis数据库,无需公网IP实现远程连接

    redis作为一种高效的key-value数据库,因其将数据存储在内存中而具备极高的读写速度,广泛应用于多种场景中。以下将详细介绍如何在centos 8的linux虚拟机上搭建redis数据库,并利用cpolar实现内网穿透以便通过公网访问。 在Linux(CentOS 8)上安装Redis数据库 …

    2026年9月23日 • 用户投稿
    100
  • 谷歌浏览器如何将网页添加到阅读清单_谷歌浏览器添加网页到阅读清单方法

    谷歌浏览器支持通过地址栏按钮、右键菜单、主菜单和快捷键四种方式将网页添加到阅读清单。1、点击地址栏右侧“添加到阅读清单”图标即可保存;2、在页面空白处右键选择“添加页面到阅读清单”;3、通过三点菜单进入书签子菜单选择“添加到阅读清单”;4、使用Command+Shift+D(Mac)或Ctrl+Sh…

    2026年9月23日
    100
  • 【Linux】初识线程

    【Linux】初识线程【Linux】初识线程【Linux】初识线程【Linux】初识线程

    一、线程的概念 线程是操作系统能够进行运算调度的基本单位,它被包含在进程之中,是进程中的实际运作单位。 定义与基本特征 轻量级实体:线程是比进程更小的可独立运行的基本单位,也被称为轻量级进程。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间、文件描述符等,但每个线程都有自己独立的程序计数…

    2026年9月23日 • 用户投稿
    000
  • vscode如何自定义状态栏 vscode底部栏的调整方法

    vscode如何自定义状态栏 vscode底部栏的调整方法vscode如何自定义状态栏 vscode底部栏的调整方法vscode如何自定义状态栏 vscode底部栏的调整方法vscode如何自定义状态栏 vscode底部栏的调整方法

    要自定义vs code状态栏,可从显示内容、顺序及颜色等方面入手。1. 调整显示内容:通过设置界面或编辑settings.json文件,控制特定元素如git信息的显示与隐藏;2. 添加自定义指示器:安装扩展并按文档配置,在状态栏展示构建状态等个性化信息;3. 自定义颜色:在settings.json…

    2026年9月23日 • 用户投稿
    000
  • Linux系统-单用户模式

    Linux系统-单用户模式Linux系统-单用户模式Linux系统-单用户模式Linux系统-单用户模式

    作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 这是Linux进阶部分的最后一大章。讲完这一章以后,我们Linux进阶部分讲完以后,我们的Linux操作部分就算讲完了,后面的讲解就主要是Linux上的应用软件的…

    2026年9月23日 • 用户投稿
    000
  • Django运行migrate报错“django.db.utils.OperationalError”:如何解决SSL连接错误?

    django运行migrate报错“django.db.utils.operationalerror”的解决方法 在使用django项目的过程中,有时候在命令行中运行“python manage.py migrate”命令时会遇到“django.db.utils.operationalerror”的…

    2026年9月23日
    000
  • LINUX下如何安装输入法_LINUX安装中文输入法(搜狗/Fcitx)教程

    首先安装Fcitx输入法框架并切换默认输入法为Fcitx,接着添加中文语言支持并配置区域选项,然后下载并安装搜狗输入法Linux版,再通过启动应用程序设置Fcitx随系统自启,最后重启会话并在Fcitx配置中添加搜狗拼音输入法。 如果您在使用Linux系统时需要输入中文,但默认环境下缺少可用的中文输…

    2026年9月23日
    200
  • Vscode怎么批量修改变量?Vscode变量重命名操作指南

    Vscode怎么批量修改变量?Vscode变量重命名操作指南Vscode怎么批量修改变量?Vscode变量重命名操作指南Vscode怎么批量修改变量?Vscode变量重命名操作指南Vscode怎么批量修改变量?Vscode变量重命名操作指南

    vscode批量修改变量的方法是选中变量按f2输入新名回车,但要更精确控制重命名范围可采取以下措施:1.使用“查找和替换”功能(ctrl+h),结合正则表达式限定匹配范围;2.使用语言支持的“重构”功能(右键→重构→重命名),基于语义分析避免误改;3.安装增强重命名插件提升功能;4.利用静态代码分析…

    2026年9月23日 • 用户投稿
    000
  • 如何在Java中安装Eclipse开发环境

    先安装JDK并配置环境变量,再下载安装Eclipse IDE。1. 安装JDK:从Oracle或Eclipse Adoptium下载JDK 17/21,按提示安装,设置JAVA_HOME和PATH,用java -version验证。2. 安装Eclipse:官网下载“Eclipse IDE for …

    2026年9月23日
    000
  • 配置Linux下vim自动缩进

    从终端打开配置文件: vim ~/.vimrc 添加如下代码: set tabstop=4set softtabstop=4set shiftwidth=4set autoindentset cindentset cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1…

    2026年9月23日
    800
  • VSCode如何实现AI辅助编程 VSCode Copilot插件的深度使用指南

    github copilot能显著提升编程效率,但需合理使用。1. 安装插件并登录github账号是基础步骤;2. 提供清晰的上下文,如规范命名和详细注释,可提高生成代码的准确性;3. 利用快捷键切换多个建议,筛选最优方案并进行修改;4. 对生成代码必须严格审查,尤其关注安全性与业务逻辑匹配度;5.…

    2026年9月23日
    100
  • Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1

    Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1

    车票 面试题1:你遇到过哪些OOM情况,什么原因造成的?怎么解决的? 该问题主要针对你遇到的实际问题出发,可以根据你实际遇到过的情况和场景,结合下面每种情况的具体原因和解决方式,整理后回答。 当堆内存(Heap Space)没有足够空间存放新创建的对象时,就会抛出 java.lang.OutOfMe…

    2026年9月23日 • 用户投稿
    000
  • VS Code团队协作:共享配置与规范

    通过共享VS Code配置实现团队协作标准化,1. 使用.settings.json统一编辑器行为;2. 集成Prettier与ESLint确保代码风格一致;3. 通过extensions.json推荐必备插件;4. 忽略私有配置文件避免冲突,提升开发效率。 在团队开发中,保持代码风格一致和开发环境…

    2026年9月23日
    000

发表回复

登录后才能评论
关注微信