go.sql_injection
Correctness
Critical
Common in Incidents
Detects SQL queries built with string concatenation instead of parameterized queries.
Why It Matters
Section titled “Why It Matters”SQL injection is a critical security vulnerability:
- Data theft — Attackers can read your entire database
- Data destruction — DROP TABLE, DELETE, UPDATE at will
- Authentication bypass — Log in as any user
- Privilege escalation — Gain admin access
One unparameterized query can compromise your entire system.
Example
Section titled “Example”// ❌ Beforequery := "SELECT * FROM users WHERE id = " + userIDdb.Query(query)
// Also badquery := fmt.Sprintf("SELECT * FROM users WHERE name = '%s'", name)If userID is "1 OR 1=1", all users are returned. If name is "'; DROP TABLE users; --", your data is gone.
// ✅ Afterdb.Query("SELECT * FROM users WHERE id = ?", userID)
// Or with named parameters (sqlx)db.NamedQuery("SELECT * FROM users WHERE name = :name", map[string]interface{}{"name": name})What Unfault Detects
Section titled “What Unfault Detects”- String concatenation (
+) in SQL query strings fmt.Sprintfwith SQL keywordsstrings.Replaceon query templates- Variable interpolation in queries
Auto-Fix
Section titled “Auto-Fix”Unfault can convert concatenated queries to parameterized form when the query structure is unambiguous.
Database Driver Placeholders
Section titled “Database Driver Placeholders”// PostgreSQL (lib/pq, pgx)db.Query("SELECT * FROM users WHERE id = $1", id)
// MySQLdb.Query("SELECT * FROM users WHERE id = ?", id)
// SQLitedb.Query("SELECT * FROM users WHERE id = ?", id)
// Multiple parameters - PostgreSQLdb.Query("SELECT * FROM users WHERE id = $1 AND status = $2", id, status)
// Multiple parameters - MySQLdb.Query("SELECT * FROM users WHERE id = ? AND status = ?", id, status)