【安全问题修复】Password Management: Empty Password(密码管理:空密码)

根据你提供的扫描报告,这个问题是 Password Management: Empty Password(密码管理:空密码)。

问题本质

代码中在初始化表单对象时,将 password 字段硬编码为了空字符串 ''。虽然这在“定义数据结构”时很常见,但安全扫描工具认为这是一种风险,因为:

  1. 它可能暗示系统允许空密码登录。
  2. 如果后续逻辑没有严格校验,攻击者可能利用这个默认值绕过验证。
  3. 在前端代码中显式声明空密码字段,不符合“最小权限”或“安全默认”原则。

修改建议

你需要修改 HeadStyle.vue 文件中的代码。根据截图,主要有两处涉及该问题的地方。

修改位置 1:Line 859 (handleCloseForTenantPwd 方法)

原代码:

this.tenantForm = {
    password: '', // 这里被标记为问题
    kaptcha: '',
    totp: ''
}

修改方案 A(推荐 - 使用 undefined 或 null):
如果不希望初始值为空字符串,可以将其设为 undefinednull,表示该字段尚未赋值。

this.tenantForm = {
    password: undefined, // 或者 null
    kaptcha: '',
    totp: ''
}

修改方案 B(推荐 - 移除该字段):
如果在初始化时根本不需要 password 这个字段(例如这是一个重置密码的弹窗,或者是关闭操作),可以直接不定义它,等到用户输入时再动态添加,或者在提交前检查。

this.tenantForm = {
    // password: '', // 注释掉或删除
    kaptcha: '',
    totp: ''
}
// 如果需要清空表单,可以使用 delete this.tenantForm.password;

修改位置 2:Line 498 (data() 方法)

原代码:

tenantForm: {
    password: '', // 这里也被标记
    kaptcha: '',
    totp: ''
},

修改方案:
同样地,将空字符串改为 undefinednull

tenantForm: {
    password: undefined, // 修改此处
    kaptcha: '',
    totp: ''
},

额外的安全检查(重要)

仅仅修改前端代码通常是为了通过扫描,但真正的安全在于后端和逻辑校验。请确保你的代码中包含以下逻辑:

  1. 非空校验: 在提交表单(登录或修改密码)之前,必须检查 password 是否为空。
    if (!this.tenantForm.password) {
        this.$message.error('密码不能为空');
        return;
    }
    
  2. 后端校验: 永远不要信任前端。后端接口必须再次校验密码字段不能为空字符串或 null

总结操作步骤

  1. 打开文件:src/pages/index/views/layout/components/HeadStyle.vue
  2. 找到第 498 行,将 password: '' 改为 password: undefined
  3. 找到第 859 行,将 password: '' 改为 password: undefined
  4. 保存并重新运行代码审计扫描。

这样修改既消除了“空密码”的字面风险,也不影响正常的业务逻辑(因为用户输入后,这个值会被覆盖)。


这是一个非常典型且容易让人困惑的误报场景。虽然截图中的代码看起来是“正常的业务逻辑”(把参数组装起来发送请求),但安全扫描工具(特别是 Fortify 这种静态分析工具)判定它违规,通常是基于以下两个核心原因:

1. 数据流追踪(Data Flow Analysis)

这是最主要的原因。静态分析工具不仅仅看这一行代码,它会向前追溯变量 pwd 的来源。

  • 场景还原:
    • 在之前的步骤中(比如你修改 tenantForm 时),你可能将 password 初始化为了空字符串 ''
    • 当用户没有输入密码,或者在某些特定分支下,这个 pwd 变量的值可能直接就是那个初始化的空字符串 ''
    • 在第 177 行 password: pwd,工具检测到你将一个可能为空的值赋值给了敏感字段 password
  • 工具的逻辑: “既然源头可能是空的,那你在这里把它传给后端,就意味着系统允许发送空密码请求。”

2. 缺乏显式校验(Lack of Validation)

在第 174 行到 180 行的这段代码块中,工具只看到了数据的流转,没有看到数据的清洗或校验

  • 缺失的逻辑: 在这段代码之前,没有类似 if (!pwd) return; 或者 if (pwd.length < 6) 这样的检查逻辑。
  • 工具的判定: 即使你在 UI 界面上做了非空校验(比如表单验证),但如果在前端 JS 逻辑层(Controller/Method 层)没有再次确认 pwd 的有效性就直接封装进 param 对象,Fortify 就会认为这是一个潜在的漏洞点——即“未经验证的输入直接用于敏感操作”。

如何修复?

要消除这个误报,你需要向扫描工具证明:“我在使用 pwd 之前,已经确保它不是空的,或者是合法的”。

方法一:添加防御性校验(推荐)

在组装 param 对象之前,加一行简单的判断。这不仅能过扫描,也是良好的编程习惯。

changeTenant(pwd) {
    // 添加校验逻辑
    if (!pwd || pwd.trim() === '') {
        console.warn("密码不能为空");
        return; // 或者抛出异常,阻止后续代码执行
    }

    const param = {
        tenantCode: this.checkedDataForTenant.id,
        password: pwd, // 此时工具知道 pwd 肯定不是空的
        kaptcha: this.tenantForm.kaptcha,
        totp: this.tenantForm.totp
    };
    // ...
}

方法二:确保源头不为空

如果你确定调用 changeTenant 的地方传入的 pwd 绝对不可能是空的(例如是从某个强制校验过的地方传来的),你可以检查调用链。但在前端代码审计中,通常建议在使用点(即第 177 行附近)做显式处理,这样最容易通过审计。

总结

这个地方被标记,不是因为 password: pwd 写法本身错了,而是因为工具认为 pwd 可能携带了之前定义的空值,且你在当前函数中没有对它进行二次确认。加上一个简单的非空判断即可解决。

posted on 2026-06-15 16:20  fox_charon  阅读(17)  评论(0)    收藏  举报

导航