nosurf
est un package HTTP pour Go qui vous aide à prévenir les attaques Cross-Site Request Forgery. Il agit comme un middleware et est donc compatible avec pratiquement toutes les applications Go HTTP.
Même si CSRF constitue une vulnérabilité importante, l'infrastructure de packages Web de Go se compose principalement de micro-frameworks qui n'implémentent pas les contrôles CSRF, et ne devraient pas le faire.
nosurf
résout ce problème en fournissant un CSRFHandler
qui encapsule votre http.Handler
et vérifie les attaques CSRF sur chaque méthode non sécurisée (non GET/HEAD/OPTIONS/TRACE).
nosurf
nécessite Go 1.1 ou version ultérieure.
Prend en charge n'importe quel http.Handler
(frameworks, vos propres gestionnaires, etc.) et agit comme tel.
Permet d'exempter des points de terminaison spécifiques des vérifications CSRF par une URL exacte, un glob ou une expression régulière.
Permet de spécifier votre propre gestionnaire d'échecs. Vous voulez présenter au pirate informatique un majeur ASCII au lieu du bon vieux HTTP 400
? Aucun problème.
Utilise des jetons masqués pour atténuer l’attaque BREACH.
N'a aucune dépendance en dehors de la bibliothèque standard Go.
package mainimport ("fmt""github.com/justinas/nosurf""html/template""net/http")var templateString string = `<!doctype html><html><body>{{ if .name }}< p>Votre nom : {{ .name }}</p>{{ end }}<form action="/" method="POST"><input type="text" name="name"><!-- Essayez de supprimer ceci ou de modifier sa valeur et voyez ce qui se passe --><input type="hidden" name="csrf_token" value="{{ .token }}"><input type="submit" value="Send"></form></body ></html>`var templ = template.Must(template.New("t1").Parse(templateString))func myFunc(w http.ResponseWriter, r *http.Request) {context := make(map[string]string)context["token"] = nosurf.Token(r)if r.Method == "POST" {context["name"] = r.FormValue("name") }templ.Execute(w, contexte) }func main() {myHandler := http.HandlerFunc(myFunc)fmt.Println("Écoute sur http://127.0.0.1:8000/")http.ListenAndServe(":8000", nosurf.New(myHandler)) }
Dans certains cas, le jeton CSRF peut être envoyé de manière non standard, par exemple, un corps ou une requête est un message codé JSON avec l'un des champs étant un jeton.
Dans ce cas, le gestionnaire (chemin) doit être exclu d'une vérification automatique en utilisant l'une des méthodes d'exemption :
func (h *CSRFHandler) ExemptFunc(fn func(r *http.Request) bool)func (h *CSRFHandler) ExemptGlob(chaîne de motif)func (h *CSRFHandler) ExemptGlobs(motifs...chaîne)func (h *CSRFHandler) ExemptPath(chemin chaîne)func (h *CSRFHandler) ExemptPaths(chemins ...chaîne)func (h *CSRFHandler) ExemptRegexp(re interface{})func (h *CSRFHandler) ExemptRegexps(res ...interface{})
Plus tard, le jeton doit être vérifié en récupérant manuellement le jeton du cookie et en fournissant le jeton envoyé dans le corps via : VerifyToken(tkn, tkn2 string) bool
.
Exemple:
func HandleJson(w http.ResponseWriter, r *http.Request) {d := struct{X,Y chaîne intTkn }{}json.Unmarshal(ioutil.ReadAll(r.Body), &d)if !nosurf.VerifyToken(nosurf.Token(r), d.Tkn) {http.Errorf(w, "Jeton CSRF incorrect", http. StatusBadRequest)retour }// faire quelque chose de cool}
Trouvez un problème qui vous dérange / ouvrez-en un nouveau.
Discuter.
Débranchez, validez, testez.
Faites une pull request / joignez les commits au problème.