Overview
Product operations issues can expose critical security vulnerabilities, compromise data integrity, and impact search functionality. The most severe issues include:- SQL injection vulnerabilities
- Unsafe query construction
- Search functionality bugs
- Input validation failures
Incidents
INC-007: SQL injection vulnerability in product search
INC-007: SQL injection vulnerability in product search
Incident Details
- Severity: P0 - Critical Security
- Service: python-service
- Environment: All
- Reported: 2026-02-28T06:00:00Z
- Status: Resolved
- CVE: CVE-2026-XXXXX (OWASP Top 10: A03:2021 – Injection)
Problem
A critical SQL injection vulnerability was discovered in theGET /api/products/search endpoint during a penetration test. The search query parameter was being interpolated directly into a raw SQL query without parameterization, allowing attackers to:- Extract all products regardless of search criteria
- Access sensitive user data including password hashes
- Modify or delete database records
- Execute arbitrary SQL commands
Root Cause
The search endpoint used Python f-string formatting to construct a raw SQL query, directly interpolating user input without any sanitization or parameterization. This is a classic SQL injection vulnerability.Location:app/routes/products.py:42-63Problematic Code
products.py
Resolution
Use SQLAlchemy’s ORM or parameterized queries to prevent SQL injection:Solution 1: Use SQLAlchemy ORM (Recommended)
products.py
Solution 2: Use Parameterized Raw SQL
If raw SQL is necessary, use parameterized queries:products.py
Additional Security Measures
1. Input Validation
products.py
2. Database User Permissions
Ensure the application database user has minimal permissions:3. Rate Limiting
products.py
Prevention
- Never use string interpolation for SQL: Always use ORM or parameterized queries
- Code review: Flag any use of
f"SELECT ...{variable}"or.format()with SQL - Static analysis: Use tools like
banditto detect SQL injection vulnerabilities - Penetration testing: Regular security audits and pen tests
- Input validation: Validate and sanitize all user input (defense in depth)
- Principle of least privilege: Database users should have minimal required permissions
- Security training: Educate developers on OWASP Top 10 vulnerabilities
Detection Tools
Bandit Security Scanner
Pre-commit Hook
.pre-commit-config.yaml
Testing for SQL Injection
Common Patterns
Safe Query Construction
Parameterized Raw SQL (When Necessary)
Input Validation Decorator
Security Checklist
Code Review Checklist
- No string interpolation (
f"SELECT ... {var}") in SQL queries - No
.format()used with SQL queries - All raw SQL uses parameterized queries (
:paramsyntax) - ORM used when possible instead of raw SQL
- Input validation on all user-provided data
- No sensitive data in error messages
- Rate limiting on search endpoints
- Database user has minimal required permissions
Testing Checklist
- Test SQL injection with
' OR '1'='1 - Test UNION attacks
- Test comment-based attacks (
--,/**/) - Test special characters in search terms
- Test excessively long input
- Verify error messages don’t leak SQL structure
Deployment Checklist
- Static analysis tools (bandit) in CI pipeline
- Regular penetration testing scheduled
- Security headers configured (CSP, X-Frame-Options, etc.)
- Database connection uses least-privilege user
- Logging of suspicious query patterns
- Rate limiting enabled
Quick Reference
| Vulnerability | Attack Example | Prevention |
|---|---|---|
| SQL Injection | ' OR '1'='1 | Use ORM or parameterized queries |
| UNION Attack | ' UNION SELECT ... | Never interpolate user input in SQL |
| Comment Injection | test'-- | Input validation + parameterized queries |
| Blind SQL Injection | ' AND SLEEP(5)-- | Use ORM, monitor slow queries |
Tools & Resources
Security Scanning Tools
Recommended Libraries
- SQLAlchemy: ORM with built-in SQL injection protection
- Flask-Limiter: Rate limiting to prevent abuse
- Flask-Talisman: Security headers for Flask apps
- python-decouple: Secure configuration management