User-provided inputs must be sanitized before being used to generate a SQL database query. An attacker can create and use untrusted input to run query statements that read, modify, or delete database content.
1def execute_query_noncompliant(request):
2 import sqlite3
3
4 name = request.GET.get("name")
5 query = "SELECT * FROM Users WHERE name = " + name + ";"
6 with sqlite3.connect("example.db") as connection:
7 cursor = connection.cursor()
8 # Noncompliant: user input is used without sanitization.
9 cursor.execute(query)
10 connection.commit()
11 connection.close()
1def execute_query_compliant(request):
2 import re
3 import sqlite3
4
5 name = request.GET.get("name")
6 query = "SELECT * FROM Users WHERE name = ?;"
7 with sqlite3.connect("example.db") as connection:
8 cursor = connection.cursor()
9 # Compliant: A parameterized query is used to pass an external input.
10 cursor.execute(query, (name,))
11 connection.commit()