Segurança de aplicações Go: top 10 vulnerabilidades para iniciantes
\n\nGo (Golang) é uma das linguagens mais populares para criar serviços web de alta carga, microsserviços e aplicações de rede. No entanto, como qualquer outra linguagem, Go exige uma abordagem cuidadosa com a segurança. Se você está começando a aprender Go, é importante conhecer as principais vulnerabilidades que podem afetar sua aplicação. Neste artigo, vamos abordar as 10 ameaças mais comuns e mostrar como evitá-las.
\n\n1. Injeção de SQL (SQL Injection)
\n\nA injeção de SQL é uma das vulnerabilidades mais antigas e perigosas. Ela ocorre quando a entrada do usuário é inserida diretamente em uma consulta SQL.
\n\nExemplo de código vulnerável:
\nfunc getUser(db *sql.DB, id string) (*User, error) {\n row := db.QueryRow("SELECT * FROM users WHERE id = " + id)\n // ...\n}\n\nComo corrigir:
\nUse consultas parametrizadas:
\nfunc getUser(db *sql.DB, id string) (*User, error) {\n row := db.QueryRow("SELECT * FROM users WHERE id = $1", id)\n // ...\n}\n\n2. Cross-Site Scripting (XSS)
\n\nO XSS ocorre quando a entrada do usuário sem escape é exibida em uma página web. Em Go, isso geralmente acontece ao usar html/template em vez de text/template.
Exemplo de código vulnerável:
\nfmt.Fprintf(w, "<p>Olá, %s</p>", r.URL.Query().Get("name"))\n\nComo corrigir:
\nUse html/template para escape automático:
tmpl := template.Must(template.New("").Parse("<p>Olá, {{.}}</p>"))\ntmpl.Execute(w, r.URL.Query().Get("name"))\n\n3. Cross-Site Request Forgery (CSRF)
\n\nOs ataques CSRF forçam o usuário a executar uma ação indesejada em um site onde está autenticado. Aplicações Go frequentemente esquecem a proteção contra CSRF.
\n\nSolução:
\nUse a biblioteca gorilla/csrf ou implemente seu próprio middleware:
import "github.com/gorilla/csrf"\n\nfunc main() {\n r := mux.NewRouter()\n r.Use(csrf.Protect([]byte("chave-de-32-bytes")))\n // ...\n}\n\n4. Tratamento inseguro de erros
\n\nUm erro comum é retornar ao usuário mensagens de erro do sistema que podem revelar a estrutura interna da aplicação.
\n\nExemplo de código vulnerável:
\nif err != nil {\n http.Error(w, err.Error(), http.StatusInternalServerError)\n}\n\nComo corrigir:
\nif err != nil {\n log.Printf("Erro: %v", err)\n http.Error(w, "Erro interno do servidor", http.StatusInternalServerError)\n}\n\n5. Vazamento de informações através de cabeçalhos
\n\nPor padrão, o servidor Go pode revelar a versão do Go, o tipo de servidor e outras informações de serviço.
\n\nSolução:
\ntype secureHandler struct {\n next http.Handler\n}\n\nfunc (h *secureHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {\n w.Header().Set("X-Content-Type-Options", "nosniff")\n w.Header().Set("X-Frame-Options", "DENY")\n w.Header().Set("X-XSS-Protection", "1; mode=block")\n h.next.ServeHTTP(w, r)\n}\n\n6. Uso incorreto de goroutines
\n\nGoroutines são uma ferramenta poderosa do Go, mas seu uso incorreto pode levar a condições de corrida (race conditions) e vazamentos de memória.
\n\nExemplo de código vulnerável:
\nvar counter int\nfor i := 0; i < 1000; i++ {\n go func() {\n counter++ // race condition!\n }()\n}\n\nComo corrigir:
\nvar mu sync.Mutex\nvar counter int\nfor i := 0; i < 1000; i++ {\n go func() {\n mu.Lock()\n counter++\n mu.Unlock()\n }()\n}\n\n7. Armazenamento inseguro de senhas
\n\nArmazenar senhas em texto puro ou usando hashes fracos (MD5, SHA1) é um erro grave.<