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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user