Seguridad de aplicaciones Go: top 10 vulnerabilidades para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Seguridad de aplicaciones Go: top 10 vulnerabilidades para principiantes

\n\n

Go (Golang) es uno de los lenguajes más populares para crear servicios web de alto rendimiento, microservicios y aplicaciones de red. Sin embargo, como cualquier otro lenguaje, Go requiere un enfoque cuidadoso en la seguridad. Si recién estás comenzando a aprender Go, es importante conocer las principales vulnerabilidades que pueden acechar a tu aplicación. En este artículo, analizaremos las 10 amenazas más comunes y mostraremos cómo evitarlas.

\n\n

1. Inyección SQL (SQL Injection)

\n\n

La inyección SQL es una de las vulnerabilidades más antiguas y peligrosas. Ocurre cuando la entrada del usuario se inserta directamente en una consulta SQL.

\n\n

Ejemplo de código vulnerable:

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

Cómo corregirlo:

\n

Utilice 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

XSS ocurre cuando la entrada del usuario sin escapar se muestra en una página web. En Go, esto suele ocurrir al usar html/template en lugar de text/template.

\n\n

Ejemplo de código vulnerable:

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

Cómo corregirlo:

\n

Utilice html/template para el escape automático:

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

3. Cross-Site Request Forgery (CSRF)

\n\n

Los ataques CSRF obligan al usuario a realizar una acción no deseada en un sitio donde está autenticado. Las aplicaciones Go a menudo olvidan la protección contra CSRF.

\n\n

Solución:

\n

Utilice la librería gorilla/csrf o implemente su propio middleware:

\n
import "github.com/gorilla/csrf"\n\nfunc main() {\n    r := mux.NewRouter()\n    r.Use(csrf.Protect([]byte("clave-de-32-bytes")))\n    // ...\n}
\n\n

4. Manejo inseguro de errores

\n\n

Un error común es devolver al usuario mensajes de error del sistema que pueden revelar la estructura interna de la aplicación.

\n\n

Ejemplo de código vulnerable:

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

Cómo corregirlo:

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

5. Fuga de información a través de cabeceras

\n\n

Por defecto, el servidor Go puede revelar la versión de Go, el tipo de servidor y otra información del sistema.

\n\n

Solución:

\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. Manejo incorrecto de gorutinas

\n\n

Las gorutinas son una herramienta poderosa de Go, pero su uso incorrecto puede provocar condiciones de carrera (race conditions) y fugas de memoria.

\n\n

Ejemplo de código vulnerable:

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

Cómo corregirlo:

\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. Almacenamiento inseguro de contraseñas

\n\n

Almacenar contraseñas en texto plano o usando hashes débiles (MD5, SHA1) es un grave error.<

Blogs

Book Recommendations