fix: 按评审报告止血支付漏洞并加固授权链路
废除浏览器回跳自助结算,通用 webhook 强制密钥鉴权,Waffo 支持验签与未知事件忽略;重构订单状态机/激活占座/SQLite WAL,并补备份、readyz、限流与前端导出/登录页安全修复。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
8cc2c83f9d
commit
bac72e6945
24 files changed
+682
-391
No files matched your search
@@ -4,24 +4,43 @@ import (
|
||||
"backend/config"
|
||||
"backend/internal/model"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
)
|
||||
|
||||
// Init 初始化数据库连接并执行迁移 // Logan.Li
|
||||
// Init 初始化数据库连接并执行迁移(当前交付形态以 SQLite 为准) // Logan.Li
|
||||
func Init(cfg *config.Config) (*gorm.DB, error) {
|
||||
logLevel := getLogLevel(cfg.Mode)
|
||||
|
||||
fmt.Printf("[数据库] 使用 SQLite: %s\n", cfg.DBName)
|
||||
db, err := gorm.Open(sqlite.Open(cfg.DBName), &gorm.Config{
|
||||
driver := strings.ToLower(strings.TrimSpace(cfg.DBDriver))
|
||||
if driver != "" && driver != "sqlite" && driver != "sqlite3" {
|
||||
return nil, fmt.Errorf("当前仅支持 SQLite(收到 DB_DRIVER=%s);MySQL/PostgreSQL 尚未接入", cfg.DBDriver)
|
||||
}
|
||||
|
||||
dsn := cfg.DBName
|
||||
if !strings.Contains(dsn, "?") {
|
||||
dsn += "?_journal_mode=WAL&_busy_timeout=5000&_synchronous=NORMAL&_foreign_keys=on"
|
||||
}
|
||||
fmt.Printf("[数据库] 使用 SQLite(WAL): %s\n", cfg.DBName)
|
||||
db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{
|
||||
Logger: logger.Default.LogMode(logLevel),
|
||||
})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("SQLite 连接失败: %v", err)
|
||||
}
|
||||
|
||||
sqlDB, err := db.DB()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sqlDB.SetMaxOpenConns(1) // SQLite 写串行化,WAL 下读不阻塞 // Logan.Li
|
||||
sqlDB.SetMaxIdleConns(1)
|
||||
sqlDB.SetConnMaxLifetime(time.Hour)
|
||||
|
||||
return migrateDatabase(db)
|
||||
}
|
||||
|
||||
@@ -37,21 +56,21 @@ func getLogLevel(mode string) logger.LogLevel {
|
||||
func migrateDatabase(db *gorm.DB) (*gorm.DB, error) {
|
||||
err := db.AutoMigrate(
|
||||
// 认证与系统
|
||||
&model.User{}, // 管理员用户 // Logan.Li
|
||||
&model.Setting{}, // 系统设置 // Logan.Li
|
||||
&model.AuditLog{}, // 操作日志 // Logan.Li
|
||||
&model.LicenseTemplate{}, // License 模板 // Logan.Li
|
||||
&model.PaymentGatewayConfig{}, // 支付网关配置 // Logan.Li
|
||||
&model.User{}, // 管理员用户 // Logan.Li
|
||||
&model.Setting{}, // 系统设置 // Logan.Li
|
||||
&model.AuditLog{}, // 操作日志 // Logan.Li
|
||||
&model.LicenseTemplate{}, // License 模板 // Logan.Li
|
||||
&model.PaymentGatewayConfig{}, // 支付网关配置 // Logan.Li
|
||||
// 核心授权域
|
||||
&model.Product{}, // 产品 // Logan.Li
|
||||
&model.Customer{}, // 客户 // Logan.Li
|
||||
&model.License{}, // License // Logan.Li
|
||||
&model.Activation{}, // 激活记录 // Logan.Li
|
||||
&model.Product{}, // 产品 // Logan.Li
|
||||
&model.Customer{}, // 客户 // Logan.Li
|
||||
&model.License{}, // License // Logan.Li
|
||||
&model.Activation{}, // 激活记录 // Logan.Li
|
||||
// 定价与订单
|
||||
&model.Plan{}, // 定价计划 // Logan.Li
|
||||
&model.Order{}, // 订单 // Logan.Li
|
||||
&model.Plan{}, // 定价计划 // Logan.Li
|
||||
&model.Order{}, // 订单 // Logan.Li
|
||||
// 防重复购买
|
||||
&model.CustomerEntitlement{}, // 客户权益 // Logan.Li
|
||||
&model.CustomerEntitlement{}, // 客户权益 // Logan.Li
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("数据库迁移失败: %v", err)
|
||||
|
||||
Reference in new issue
Block a user