From d27d29ae34b42cf58187f19ab771fbee4ff9d806 Mon Sep 17 00:00:00 2001 From: Simon Rieger Date: Mon, 1 Apr 2024 12:58:36 +0200 Subject: [PATCH] add nonce support with safe CSP --- docker-compose.yml | 1 + go/main.go | 28 +++++++++++++++++++++++++++- static/js/script.js | 15 +++++++++++++++ templates/uploadSuccess.html | 26 +++++++++++++++++++++++++- 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 static/js/script.js diff --git a/docker-compose.yml b/docker-compose.yml index d873ff2..82bbb3a 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,6 +19,7 @@ services: volumes: - ./uploads:/uploads - ./templates:/templates + - ./static:/static restart: always diff --git a/go/main.go b/go/main.go index 9b9d527..dcbb291 100644 --- a/go/main.go +++ b/go/main.go @@ -12,6 +12,8 @@ import ( "strings" "sync" "time" + "crypto/rand" + "encoding/base64" ) var ( @@ -25,6 +27,9 @@ func main() { http.HandleFunc("/upload", uploadHandler) http.HandleFunc("/image/", imageHandler) http.HandleFunc("/view/", viewHandler) + // Statischen Dateipfad setzen + fs := http.FileServer(http.Dir("static")) + http.Handle("/static/", http.StripPrefix("/static/", fs)) fmt.Println("Server listening on :8080") http.ListenAndServe(":8080", nil) @@ -53,9 +58,28 @@ func homeHandler(w http.ResponseWriter, r *http.Request) { } } +func generateNonce() (string, error) { + nonceBytes := make([]byte, 16) // 16 Bytes generieren eine ausreichend lange Zeichenfolge für den Nonce + if _, err := rand.Read(nonceBytes); err != nil { + return "", err // Im Fehlerfall, geben Sie den Fehler zurück + } + return base64.StdEncoding.EncodeToString(nonceBytes), nil +} + + func uploadHandler(w http.ResponseWriter, r *http.Request) { + nonce, err := generateNonce() + if err != nil { + // Fehlerbehandlung, z.B. Senden eines Serverfehlers + http.Error(w, "Serverfehler", http.StatusInternalServerError) + log.Printf("Fehler beim Generieren des Nonce: %v", err) + return + } + // Setzen der Content Security Policy - 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';") + //w.Header().Set("Content-Security-Policy", fmt.Sprintf("default-src 'self'; script-src 'self' 'nonce-%s'; object-src 'none';", nonce)) + w.Header().Set("Content-Security-Policy", fmt.Sprintf("script-src 'self' 'nonce-%s';", nonce)) mu.Lock() defer mu.Unlock() @@ -139,9 +163,11 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) { data := struct { Message string Filename string + Nonce string }{ Message: "Bild erfolgreich hochgeladen.", Filename: filename, // Geändert, um den möglicherweise modifizierten Dateinamen anzuzeigen + Nonce: nonce, } err = tmpl.Execute(w, data) diff --git a/static/js/script.js b/static/js/script.js new file mode 100644 index 0000000..3efaa4d --- /dev/null +++ b/static/js/script.js @@ -0,0 +1,15 @@ +document.addEventListener('DOMContentLoaded', (event) => { + document.getElementById('copyButton').addEventListener('click', kopiereURL); +}); + +function kopiereURL() { + var copyText = document.getElementById("imageURL"); + copyText.select(); + copyText.setSelectionRange(0, 99999); // Für mobile Geräte + + navigator.clipboard.writeText(copyText.value).then(function() { + console.log('Kopieren in die Zwischenablage erfolgreich.'); + }, function(err) { + console.error('Fehler beim Kopieren in die Zwischenablage: ', err); + }); +} diff --git a/templates/uploadSuccess.html b/templates/uploadSuccess.html index 6a9194c..66895d6 100644 --- a/templates/uploadSuccess.html +++ b/templates/uploadSuccess.html @@ -5,7 +5,31 @@

{{.Message}}

- Ihr Bild anzeigen + +

Ihr Bild anzeigen

+ + + +

Zurück zum Upload

+ + + +