D. A safe SQL query with escaped input preventing injection
Solution
Step 1: Understand ORM query with dangerous input
ORM escapes dangerous characters in user_input to prevent SQL injection.
Step 2: Analyze printed query behavior
Printed query shows safe SQL with escaped input, not raw injection or errors.
Final Answer:
A safe SQL query with escaped input preventing injection -> Option D
Quick Check:
ORM escapes dangerous input = B [OK]
Hint: ORM escapes dangerous input, so injection won't happen [OK]
Common Mistakes:
Assuming raw SQL runs as is
Expecting syntax errors from quotes
Thinking ORM ignores dangerous input
4. Identify the error in this Django ORM code that tries to prevent SQL injection:
query = "SELECT * FROM users WHERE username = '%s'" % user_input
users = User.objects.raw(query)
medium
A. The raw() method automatically escapes inputs, so no error.
B. Using raw SQL with string formatting allows SQL injection.
C. The filter() method should be used instead of raw().
D. The query string is missing parameter placeholders.
Solution
Step 1: Analyze string formatting with user input
Using % formatting inserts user_input directly, risking SQL injection.
Step 2: Understand raw() method behavior
raw() executes raw SQL without escaping, so injection risk remains.
Final Answer:
Using raw SQL with string formatting allows SQL injection. -> Option B
Quick Check:
String formatting + raw() = injection risk = A [OK]
Hint: Never build raw SQL with string formatting; use ORM methods [OK]
Common Mistakes:
Assuming raw() escapes inputs
Using raw SQL instead of filter()
Ignoring injection risk in string formatting
5. You want to safely filter users by email domain using Django ORM. Which approach correctly prevents SQL injection?
user_domain = request.GET.get('domain')
# Which code is safe?
A) User.objects.filter(email__endswith=user_domain)
B) User.objects.raw(f"SELECT * FROM users WHERE email LIKE '%{user_domain}'")
C) User.objects.filter(email__endswith='%' + user_domain)
D) User.objects.raw("SELECT * FROM users WHERE email LIKE '%" + user_domain + "'")
hard
A. User.objects.filter(email__endswith=user_domain)
B. User.objects.raw(f"SELECT * FROM users WHERE email LIKE '%{user_domain}'")
C. User.objects.filter(email__endswith='%' + user_domain)
D. User.objects.raw("SELECT * FROM users WHERE email LIKE '%" + user_domain + "'")
Solution
Step 1: Identify safe ORM filtering for email domain
Using filter() with email__endswith=user_domain safely escapes input and builds query.
Step 2: Analyze raw() and string concatenation risks
Options B and D use raw SQL with string interpolation, risking injection. User.objects.filter(email__endswith='%' + user_domain) incorrectly adds '%' in Python string, not ORM pattern.
Final Answer:
User.objects.filter(email__endswith=user_domain) -> Option A
Quick Check:
Use ORM filter with lookup for safe input handling = A [OK]
Hint: Use ORM lookups like __endswith, avoid raw SQL with user input [OK]