diff --git a/web/controller/server.go b/web/controller/server.go index 9e649e6ca2..7122d0cea7 100644 --- a/web/controller/server.go +++ b/web/controller/server.go @@ -1,6 +1,9 @@ package controller import ( + "fmt" + "net/http" + "regexp" "time" "x-ui/web/global" "x-ui/web/service" @@ -8,6 +11,8 @@ import ( "github.com/gin-gonic/gin" ) +var filenameRegex = regexp.MustCompile(`^[a-zA-Z0-9_\-.]+$`) + type ServerController struct { BaseController @@ -136,9 +141,17 @@ func (a *ServerController) getDb(c *gin.Context) { jsonMsg(c, "get Database", err) return } + + filename := "x-ui.db" + + if !filenameRegex.MatchString(filename) { + c.AbortWithError(http.StatusBadRequest, fmt.Errorf("invalid filename")) + return + } + // Set the headers for the response c.Header("Content-Type", "application/octet-stream") - c.Header("Content-Disposition", "attachment; filename=x-ui.db") + c.Header("Content-Disposition", "attachment; filename="+filename) // Write the file contents to the response c.Writer.Write(db)