add feature to prevent out brake the directory

This commit is contained in:
Simon Rieger 2024-03-09 14:09:03 +01:00
parent 955e2775d3
commit b25f2a9aa0

View file

@ -7,6 +7,8 @@ import (
"log" "log"
"net/http" "net/http"
"os" "os"
"path"
"path/filepath"
"strings" "strings"
"sync" "sync"
"time" "time"
@ -162,22 +164,47 @@ func imageHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Security-Policy", "default-src 'self'; script-src 'self'; object-src 'none';") w.Header().Set("Content-Security-Policy", "default-src 'self'; script-src 'self'; object-src 'none';")
// Extrahieren des Bildnamens aus dem URL-Pfad // Extrahieren des Bildnamens aus dem URL-Pfad
imagePath := "./uploads/" + r.URL.Path[len("/image/"):] imagePath := r.URL.Path[len("/image/"):]
// Reinigen des Pfades, um Directory Traversal zu verhindern
cleanedPath := path.Clean("/uploads/" + imagePath)
// Generieren des absoluten Pfads zum uploads-Verzeichnis
uploadsDir, err := filepath.Abs("./uploads")
if err != nil {
http.Error(w, "Interner Serverfehler", http.StatusInternalServerError)
log.Printf("Fehler beim Ermitteln des absoluten Pfads des uploads-Verzeichnisses: %v", err)
return
}
// Generieren des absoluten Pfads zur angeforderten Datei
absImagePath, err := filepath.Abs(cleanedPath)
if err != nil {
http.Error(w, "Interner Serverfehler", http.StatusInternalServerError)
log.Printf("Fehler beim Ermitteln des absoluten Pfads des Bildes: %v", err)
return
}
// Sicherstellen, dass das Bild im uploads-Verzeichnis liegt
if !strings.HasPrefix(absImagePath, uploadsDir) {
http.Error(w, "Zugriff verweigert", http.StatusForbidden)
log.Printf("Versuch, auf Datei außerhalb des uploads-Verzeichnisses zuzugreifen: %v", absImagePath)
return
}
// Stellen Sie sicher, dass das Bild existiert // Stellen Sie sicher, dass das Bild existiert
if _, err := os.Stat(imagePath); os.IsNotExist(err) { if _, err := os.Stat(absImagePath); os.IsNotExist(err) {
http.Error(w, "Bild nicht gefunden", http.StatusNotFound) http.Error(w, "Bild nicht gefunden", http.StatusNotFound)
log.Printf("Bild nicht gefunden: %v", err) log.Printf("Bild nicht gefunden: %v", err)
return return
} }
// Setzen der korrekten MIME-Type basierend auf der Dateiendung // Setzen der korrekten MIME-Type basierend auf der Dateiendung
// Optional, verbessert aber die Kompatibilität
mimeType := "image/jpeg" // Standardwert; könnte dynamisch basierend auf der Dateiendung festgelegt werden mimeType := "image/jpeg" // Standardwert; könnte dynamisch basierend auf der Dateiendung festgelegt werden
w.Header().Set("Content-Type", mimeType) w.Header().Set("Content-Type", mimeType)
// Ausliefern des Bildes // Ausliefern des Bildes
http.ServeFile(w, r, imagePath) http.ServeFile(w, r, absImagePath)
} }
func viewHandler(w http.ResponseWriter, r *http.Request) { func viewHandler(w http.ResponseWriter, r *http.Request) {