filepath.Localize în Go

Transformă o cale cu „/” (ca în fs.FS sau URL) într-o cale locală a sistemului, refuzând căile nesigure.

Sintaxă
func Localize(path string) (string, error)

Ce face filepath.Localize

filepath.Localize primește o cale în formatul io/fs (separator /, fără / la început, fără ..) și returnează varianta pentru sistemul curent: pe Windows înlocuiește / cu \.

Dacă calea nu este validă pentru fs.ValidPath sau nu poate fi reprezentată local (pe Windows: conține \, : sau un nume rezervat), returnează o eroare. Este mai strictă decât FromSlash și o folosești când transformi căi primite din exterior.

Parametri

Parametru Descriere
path Calea cu separator /.

Ce returnează

Calea locală și nil, sau "" și o eroare.

Exemple

Exemplul 1: Căi acceptate și refuzate

Rezultat pe Linux/macOS, unde separatorul rămâne /.

package main

import (
    "fmt"
    "path/filepath"
)

func main() {
    for _, c := range []string{"css/stil.css", "../secret", "/etc/passwd", "a//b", "."} {
        local, err := filepath.Localize(c)
        fmt.Printf("%-14q -> %q, eroare: %v\n", c, local, err)
    }
}

Rezultat

"css/stil.css" -> "css/stil.css", eroare: <nil>
"../secret"    -> "", eroare: invalid path
"/etc/passwd"  -> "", eroare: invalid path
"a//b"         -> "", eroare: invalid path
"."            -> ".", eroare: <nil>

Exemplul 2: Pe Windows

package main

import (
    "fmt"
    "path/filepath"
)

func main() {
    for _, c := range []string{"css/stil.css", `a\b`, "NUL"} {
        local, err := filepath.Localize(c)
        fmt.Printf("%q -> %q, eroare: %v\n", c, local, err)
    }
}

Rezultat pe Windows

"css/stil.css" -> "css\\stil.css", eroare: <nil>
"a\\b" -> "", eroare: invalid path
"NUL" -> "", eroare: invalid path

Greșeli frecvente

  • Folosești FromSlash pentru căi venite din URL-uri. FromSlash nu refuză ..; Localize da.

Comenzi înrudite

  • filepath.FromSlash: FromSlash înlocuiește „/” cu separatorul sistemului; ToSlash face invers, înlocuind separatorul cu „/”.
  • filepath.IsLocal: Spune dacă o cale rămâne în interiorul directorului curent: nu e absolută, nu e goală și nu urcă cu „..”.
  • os.DirFS: Transformă un director de pe disc într-un fs.FS, sistemul de fișiere abstract din Go.