Segurança de aplicações Go: top 10 vulnerabilidades para iniciantes

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Segurança de aplicações Go: top 10 vulnerabilidades para iniciantes

\n\n

Go (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\n

1. Injeção de SQL (SQL Injection)

\n\n

A 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\n

Exemplo de código vulnerável:

\n
func getUser(db *sql.DB, id string) (*User, error) {\n    row := db.QueryRow("SELECT * FROM users WHERE id = " + id)\n    // ...\n}
\n\n

Como corrigir:

\n

Use consultas parametrizadas:

\n
func getUser(db *sql.DB, id string) (*User, error) {\n    row := db.QueryRow("SELECT * FROM users WHERE id = $1", id)\n    // ...\n}
\n\n

2. Cross-Site Scripting (XSS)

\n\n

O 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.

\n\n

Exemplo de código vulnerável:

\n
fmt.Fprintf(w, "<p>Olá, %s</p>", r.URL.Query().Get("name"))
\n\n

Como corrigir:

\n

Use html/template para escape automático:

\n
tmpl := template.Must(template.New("").Parse("<p>Olá, {{.}}</p>"))\ntmpl.Execute(w, r.URL.Query().Get("name"))
\n\n

3. Cross-Site Request Forgery (CSRF)

\n\n

Os 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\n

Solução:

\n

Use a biblioteca gorilla/csrf ou implemente seu próprio middleware:

\n
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\n

4. Tratamento inseguro de erros

\n\n

Um erro comum é retornar ao usuário mensagens de erro do sistema que podem revelar a estrutura interna da aplicação.

\n\n

Exemplo de código vulnerável:

\n
if err != nil {\n    http.Error(w, err.Error(), http.StatusInternalServerError)\n}
\n\n

Como corrigir:

\n
if err != nil {\n    log.Printf("Erro: %v", err)\n    http.Error(w, "Erro interno do servidor", http.StatusInternalServerError)\n}
\n\n

5. Vazamento de informações através de cabeçalhos

\n\n

Por padrão, o servidor Go pode revelar a versão do Go, o tipo de servidor e outras informações de serviço.

\n\n

Solução:

\n
type 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\n

6. Uso incorreto de goroutines

\n\n

Goroutines 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\n

Exemplo de código vulnerável:

\n
var counter int\nfor i := 0; i < 1000; i++ {\n    go func() {\n        counter++ // race condition!\n    }()\n}
\n\n

Como corrigir:

\n
var 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\n

7. Armazenamento inseguro de senhas

\n\n

Armazenar senhas em texto puro ou usando hashes fracos (MD5, SHA1) é um erro grave.<

Blogs

Book Recommendations