fix(backend): add path validation to DeleteMod and improve GetLog security
- DeleteMod now validates path prefix against SERVERFILE_DIR and MODS_DIR before allowing deletion (prevents arbitrary directory deletion) - GetLog uses strings.ContainsAny for cross-platform path traversal check
This commit is contained in:
@@ -170,7 +170,7 @@ func findLatestRPT(dir string) string {
|
|||||||
|
|
||||||
func (h *Handler) GetLog(c *gin.Context) {
|
func (h *Handler) GetLog(c *gin.Context) {
|
||||||
filename := filepath.Base(c.Param("file"))
|
filename := filepath.Base(c.Param("file"))
|
||||||
if filename == "" || strings.ContainsRune(c.Param("file"), os.PathSeparator) {
|
if filename == "" || filename == "." || strings.ContainsAny(filename, "/\\") {
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid filename"})
|
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid filename"})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"arma3-web-server/internal/services"
|
"arma3-web-server/internal/services"
|
||||||
|
|
||||||
@@ -54,7 +56,18 @@ func (h *Handler) DeleteMod(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := services.RemoveMod(input.Path); err != nil {
|
absPath, err := filepath.Abs(input.Path)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid path"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.HasPrefix(absPath, h.serverfileDir) && !strings.HasPrefix(absPath, h.modsDir) {
|
||||||
|
c.JSON(http.StatusForbidden, gin.H{"error": "path outside allowed directories"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := services.RemoveMod(absPath); err != nil {
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user