| name | sql-injection-anti-pattern |
| description | Security anti-pattern for SQL Injection vulnerabilities (CWE-89). Use when generating or reviewing code that constructs database queries, builds SQL statements, or handles user input in database operations. Detects string concatenation in queries and recommends parameterized queries. |
SQL Injection Anti-Pattern
Severity: Critical
Summary
Attackers execute arbitrary SQL commands by manipulating user input. String concatenation in queries (frequently AI-generated from insecure training data) enables database compromise, data exfiltration, authentication bypass, and remote code execution.
The Anti-Pattern
The anti-pattern is concatenating user data into SQL statements, allowing attackers to break query structure and inject malicious SQL.
BAD Code Example
import sqlite3
def get_user(db_connection, username):
query = "SELECT * FROM users WHERE username = '" + username + "'"
cursor = db_connection.cursor()
cursor.execute(query)
return cursor.fetchone()
GOOD Code Example
import sqlite3
def get_user(db_connection, username):
query = "SELECT * FROM users WHERE username = ?"
cursor = db_connection.cursor()
cursor.execute(query, (username,))
return cursor.fetchone()
Detection
- Look for string concatenation (
+, ||, concat(), f-strings, template literals) used to build SQL queries.
- Search for calls to
execute(), query(), or raw() that take a single string variable which may contain user input.
- Check for the use of
.format(), %s, or ${} within SQL query strings.
- Review any code that dynamically constructs SQL based on user input without proper parameterization.
Prevention
Related Security Patterns & Anti-Patterns
References