Bezbednost: limit veličine upload tela, anti-enumeracija pri prijavi, strings.Cut

- CSRF middleware postavlja MaxBytesReader (6 MB) za multipart pre parsiranja —
  pojedinačni upload handleri nisu mogli da ograniče veličinu jer čitanje _csrf
  polja već parsira celo telo
- prijava: dummy bcrypt poređenje kada korisnik ne postoji, da vreme odgovora
  bude isto kao kod postojećeg korisnika (sprečava enumeraciju imena)
- podesavanja: strings.Split(...)[0] zamenjen sa strings.Cut
This commit is contained in:
2026-06-20 14:07:38 +02:00
parent 8c0e9d50a0
commit 1068bb12e0
4 changed files with 27 additions and 2 deletions
+12
View File
@@ -6,10 +6,17 @@ import (
"encoding/base64"
"net/http"
"os"
"strings"
)
const csrfKolacic = "ntech_csrf"
// maxTeloUpload je gornja granica veličine tela multipart zahteva (upload fajlova).
// Postavlja se u middleware-u pre parsiranja jer čitanje _csrf polja već parsira
// telo — bez ovog limita pojedinačni handleri ne mogu da ga efektivno ograniče.
// Najveći legitiman upload je 5 MB (avatar, pozadina); ostatak je rezerva za form overhead.
const maxTeloUpload = 6 << 20
type csrfKljucTip struct{}
var csrfKljuc = csrfKljucTip{}
@@ -52,6 +59,11 @@ func CsrfMiddleware(next http.Handler) http.Handler {
// validiramo na svim mutabilnim HTTP metodama
switch r.Method {
case http.MethodPost, http.MethodPut, http.MethodPatch, http.MethodDelete:
// ograničavamo veličinu tela PRE parsiranja — čitanje _csrf polja parsira
// celo telo, pa je ovo jedino mesto gde limit za upload stvarno deluje
if strings.HasPrefix(r.Header.Get("Content-Type"), "multipart/form-data") {
r.Body = http.MaxBytesReader(w, r.Body, maxTeloUpload)
}
// čitamo token iz tela forme ili zaglavlja (za AJAX)
submitted := r.FormValue("_csrf")
if submitted == "" {