SQL injection occurs when user input is directly concatenated into SQL queries, allowing attackers to manipulate the database.
Example of vulnerable code:
# VULNERABLE
query = f"SELECT * FROM users WHERE username = '{username}'"
Attack example: username = "admin'; DROP TABLE users; --"
Prevention methods:
Secure example:
# SECURE - Using parameterized query
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))