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 初始化日志系统,将日志输出到控制台和文件
3238func 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() {
7095func 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