diff --git a/crates/erp-server/src/config.rs b/crates/erp-server/src/config.rs index 49e54b5..82d2166 100644 --- a/crates/erp-server/src/config.rs +++ b/crates/erp-server/src/config.rs @@ -188,9 +188,30 @@ impl AppConfig { .build()?; let app_config: Self = config.try_deserialize()?; - // 安全检查:禁止在生产使用默认 JWT 密钥 - if app_config.jwt.secret == "change-me-in-production" { - tracing::warn!("⚠️ JWT 密钥使用默认值,请通过 ERP__JWT__SECRET 环境变量设置安全密钥"); + // 安全检查:禁止在生产使用占位/默认 JWT 密钥。 + // 与 KEK(见 main.rs:453 `== "__MUST_SET_VIA_ENV__"`)/storage_key(见 default_secret_key) + // 的 release panic 防护对称。关键风险:生产忘设 ERP__JWT__SECRET 时,secret 取 + // config/default.toml 的占位符值并静默运行,任意 token 可被伪造。 + // 注:原检查常量 "change-me-in-production" 在仓库中无任何注入源(doc-code drift 死代码), + // 已改为覆盖全部已知不安全值。详见上线评估 B4 + 症状导航。 + const UNSAFE_JWT_SECRETS: &[&str] = &[ + "__MUST_SET_VIA_ENV__", // config/default.toml 占位符(与 KEK 检查一致) + "dev-secret-key-change-in-prod", // dev.ps1 注入的开发值 + "change-me-in-production", // 历史遗留默认值(向后兼容) + ]; + if UNSAFE_JWT_SECRETS.contains(&app_config.jwt.secret.as_str()) { + #[cfg(debug_assertions)] + { + tracing::warn!( + "⚠️ JWT 密钥使用占位/开发默认值(开发环境允许),生产环境将 panic;请通过 ERP__JWT__SECRET 设置安全密钥" + ); + } + #[cfg(not(debug_assertions))] + { + panic!( + "ERP__JWT__SECRET 必须设置安全密钥(生产环境不允许使用占位/默认 JWT 密钥,否则任意 token 可被伪造)" + ); + } } Ok(app_config)