fix(server): B4 JWT 默认密钥 release panic 对称防护 + 修正 doc-code drift 死代码

原 config.rs 检查 'change-me-in-production',该常量仓库无注入源(dev.ps1 用 'dev-secret-key-change-in-prod',default.toml 用 '__MUST_SET_VIA_ENV__'),warn 永不命中,生产忘设 ERP__JWT__SECRET 时静默运行可伪造任意 token。改为 UNSAFE_JWT_SECRETS 集合检查,release panic 与 KEK/storage_key 对称。上线评估 B4。
This commit is contained in:
iven
2026-06-26 15:17:53 +08:00
parent c814a4a8f3
commit 288c73fd14

View File

@@ -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)