En aquest tema, explorarem les millors pràctiques de seguretat per a les aplicacions desenvolupades en Go. La seguretat és un aspecte crític en el desenvolupament de programari, i és essencial assegurar-se que les aplicacions siguin robustes contra atacs i vulnerabilitats.
- Validació d'Entrades
Conceptes Clau
- Validació d'Entrades: Assegurar-se que totes les dades d'entrada siguin vàlides i segures.
- Sanitització: Netejar les dades d'entrada per eliminar qualsevol contingut maliciós.
Exemples Pràctics
package main
import (
"fmt"
"net/http"
"regexp"
)
func isValidInput(input string) bool {
// Exemple de validació simple amb una expressió regular
validInput := regexp.MustCompile(`^[a-zA-Z0-9]+$`)
return validInput.MatchString(input)
}
func handler(w http.ResponseWriter, r *http.Request) {
input := r.URL.Query().Get("input")
if !isValidInput(input) {
http.Error(w, "Invalid input", http.StatusBadRequest)
return
}
fmt.Fprintf(w, "Valid input: %s", input)
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}Errors Comuns
- No validar les dades d'entrada.
- Confiar en les dades d'entrada sense sanititzar-les.
- Gestió Segura de les Credencials
Conceptes Clau
- Emmagatzematge Segur: Utilitzar mecanismes segurs per emmagatzemar credencials.
- Encriptació: Encriptar les credencials abans d'emmagatzemar-les.
Exemples Pràctics
package main
import (
"fmt"
"golang.org/x/crypto/bcrypt"
)
func hashPassword(password string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(bytes), err
}
func checkPasswordHash(password, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}
func main() {
password := "mySuperSecretPassword"
hash, _ := hashPassword(password)
fmt.Println("Password:", password)
fmt.Println("Hash: ", hash)
match := checkPasswordHash(password, hash)
fmt.Println("Match: ", match)
}Errors Comuns
- Emmagatzemar contrasenyes en text pla.
- No utilitzar encriptació per a les credencials.
- Protecció contra Atacs de Cross-Site Scripting (XSS)
Conceptes Clau
- XSS: Un atac que permet a un atacant injectar scripts maliciosos en pàgines web vistes per altres usuaris.
- Escapament de Dades: Escapar les dades abans de mostrar-les en una pàgina web.
Exemples Pràctics
package main
import (
"html/template"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
input := r.URL.Query().Get("input")
tmpl := template.Must(template.New("example").Parse(`<html><body>{{.}}</body></html>`))
tmpl.Execute(w, template.HTML(input))
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}Errors Comuns
- No escapar les dades d'entrada abans de mostrar-les.
- Confiar en les dades d'entrada sense sanititzar-les.
- Protecció contra Atacs de Cross-Site Request Forgery (CSRF)
Conceptes Clau
- CSRF: Un atac que força a un usuari autenticat a executar accions no desitjades en una aplicació web.
- Tokens CSRF: Utilitzar tokens únics per a cada sessió per prevenir atacs CSRF.
Exemples Pràctics
package main
import (
"crypto/rand"
"encoding/base64"
"net/http"
)
func generateCSRFToken() (string, error) {
token := make([]byte, 32)
_, err := rand.Read(token)
if err != nil {
return "", err
}
return base64.URLEncoding.EncodeToString(token), nil
}
func handler(w http.ResponseWriter, r *http.Request) {
csrfToken, _ := generateCSRFToken()
http.SetCookie(w, &http.Cookie{
Name: "csrf_token",
Value: csrfToken,
})
w.Write([]byte("CSRF token generated and set in cookie"))
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}Errors Comuns
- No utilitzar tokens CSRF.
- No validar els tokens CSRF en les peticions.
- Gestió de Sessions
Conceptes Clau
- Sessions: Mantenir l'estat de l'usuari entre peticions.
- Cookies Segures: Utilitzar cookies segures per emmagatzemar informació de sessió.
Exemples Pràctics
package main
import (
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
sessionID := "exampleSessionID"
http.SetCookie(w, &http.Cookie{
Name: "session_id",
Value: sessionID,
HttpOnly: true,
Secure: true,
})
w.Write([]byte("Session ID set in cookie"))
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}Errors Comuns
- No utilitzar cookies segures.
- Emmagatzemar informació sensible en cookies sense encriptar.
Conclusió
En aquesta secció, hem explorat diverses millors pràctiques de seguretat per a les aplicacions Go, incloent la validació d'entrades, la gestió segura de credencials, la protecció contra atacs XSS i CSRF, i la gestió de sessions. Implementar aquestes pràctiques ajudarà a assegurar que les teves aplicacions siguin més segures i robustes contra atacs. En el proper tema, ens centrarem en la monitorització i l'optimització del rendiment de les aplicacions Go.
Curs de Programació en Go
Mòdul 1: Introducció a Go
- Introducció a Go
- Configuració de l'Entorn Go
- El Teu Primer Programa en Go
- Sintaxi i Estructura Bàsiques
Mòdul 2: Conceptes Bàsics
Mòdul 3: Estructures de Dades Avançades
Mòdul 4: Gestió d'Errors
Mòdul 5: Concurrència
Mòdul 6: Temes Avançats
Mòdul 7: Desenvolupament Web amb Go
Mòdul 8: Treballant amb Bases de Dades
Mòdul 9: Desplegament i Manteniment
- Construcció i Desplegament d'Aplicacions Go
- Registre
- Monitorització i Optimització del Rendiment
- Millors Pràctiques de Seguretat
