Skip to content

Commit a48594d

Browse files
committed
Update.
1 parent 5246b2b commit a48594d

File tree

2 files changed

+71
-7
lines changed

2 files changed

+71
-7
lines changed

cmd/dashboard/main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ func main() {
6767

6868
// 设置日志目录
6969
if dashboardCliParam.LogDir != "" {
70-
singleton.SetLogDir(dashboardCliParam.LogDir)
70+
if err := singleton.SetLogDir(dashboardCliParam.LogDir); err != nil {
71+
fmt.Printf("设置日志目录失败: %v\n", err)
72+
os.Exit(1)
73+
}
7174
}
7275

7376
// 初始化日志系统

service/singleton/log.go

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,15 @@ var (
1818
logFilePrefix = "serverstatus"
1919
)
2020

21-
// SetLogDir 设置日志目录
22-
func SetLogDir(dir string) {
21+
// SetLogDir 设置日志目录,增加路径验证
22+
func SetLogDir(dir string) error {
23+
// 安全检查:验证目录路径
24+
if !isValidPath(dir) {
25+
return fmt.Errorf("日志目录路径包含非法字符: %s", dir)
26+
}
27+
2328
logDir = dir
29+
return nil
2430
}
2531

2632
// SetLogFilePrefix 设置日志文件名前缀
@@ -30,15 +36,34 @@ func SetLogFilePrefix(prefix string) {
3036

3137
// InitLogger 初始化日志系统,将日志输出到控制台和文件
3238
func InitLogger() error {
33-
// 创建日志目录
34-
if err := os.MkdirAll(logDir, 0755); err != nil {
39+
// 安全检查:验证日志目录路径不包含可疑字符
40+
if !isValidPath(logDir) {
41+
return fmt.Errorf("日志目录路径包含非法字符: %s", logDir)
42+
}
43+
44+
// 创建日志目录,权限从0755改为0750
45+
if err := os.MkdirAll(logDir, 0750); err != nil {
3546
return fmt.Errorf("创建日志目录失败: %v", err)
3647
}
3748

38-
// 创建日志文件
49+
// 创建日志文件,使用安全的时间格式
3950
timestamp := time.Now().Format("2006-01-02")
51+
52+
// 额外检查时间戳格式
53+
if !isValidTimestamp(timestamp) {
54+
return fmt.Errorf("生成的时间戳格式无效: %s", timestamp)
55+
}
56+
57+
// 构建日志文件名
4058
logFileName := filepath.Join(logDir, fmt.Sprintf("%s-%s.log", logFilePrefix, timestamp))
41-
file, err := os.OpenFile(logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
59+
60+
// 再次验证完整路径
61+
if !isValidPath(logFileName) {
62+
return fmt.Errorf("生成的日志文件路径无效: %s", logFileName)
63+
}
64+
65+
// 文件权限从0644改为0600
66+
file, err := os.OpenFile(logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
4267
if err != nil {
4368
return fmt.Errorf("创建日志文件失败: %v", err)
4469
}
@@ -70,3 +95,39 @@ func CloseLogger() {
7095
func SetLogLevel(level string) {
7196
// 暂时不实现,仅提供接口
7297
}
98+
99+
// isValidPath 检查路径是否合法
100+
func isValidPath(path string) bool {
101+
// 检查路径是否包含可疑字符
102+
// 此处可以根据实际需求调整规则
103+
104+
// 不允许使用路径穿越攻击
105+
cleanPath := filepath.Clean(path)
106+
if filepath.IsAbs(path) && !filepath.IsAbs(cleanPath) {
107+
return false
108+
}
109+
110+
// 检查路径中是否包含"../",防止目录遍历
111+
if cleanPath != path {
112+
return false
113+
}
114+
115+
// 其他基本检查可以根据需要添加
116+
return true
117+
}
118+
119+
// isValidTimestamp 检查时间戳是否符合预期格式
120+
func isValidTimestamp(timestamp string) bool {
121+
// 检查时间戳是否为10位数字格式(2006-01-02)
122+
if len(timestamp) != 10 {
123+
return false
124+
}
125+
126+
// 检查时间戳格式
127+
if timestamp[4] != '-' || timestamp[7] != '-' {
128+
return false
129+
}
130+
131+
// 更详细的验证可以根据需要添加
132+
return true
133+
}

0 commit comments

Comments
 (0)