| name | missing-input-validation-anti-pattern |
| description | Security anti-pattern for missing input validation (CWE-20). Use when generating or reviewing code that processes user input, form data, API parameters, or external data. Detects client-only validation, missing type checks, and absent length limits. Foundation vulnerability enabling most attack classes. |
Missing Input Validation Anti-Pattern
Severity: High
Summary
Missing input validation occurs when applications fail to validate data from users or external sources before processing it. This enables SQL Injection, Cross-Site Scripting (XSS), Command Injection, and Path Traversal attacks. Treat all incoming data as untrusted. Validate against strict rules for type, length, format, and range.
The Anti-Pattern
Trusting external input without server-side validation. Client-side validation provides no security—attackers bypass it trivially.
BAD Code Example
from flask import request
import sqlite3
@app.route("/api/products")
def search_products():
category = request.args.get("category")
db = sqlite3.connect("database.db")
cursor = db.cursor()
query = f"SELECT id, name, price FROM products WHERE category = '{category}'"
cursor.execute(query)
products = cursor.fetchall()
return {"products": products}
GOOD Code Example
from flask import request
import sqlite3
ALLOWED_CATEGORIES = {"electronics", "books", "clothing", "homegoods"}
@app.route("/api/products/safe")
def search_products_safe():
category = request.args.get("category")
if not category:
return {"error": "Category parameter is required."}, 400
if category not in ALLOWED_CATEGORIES:
return {"error": "Invalid category specified."}, 400
db = sqlite3.connect("database.db")
cursor = db.cursor()
query = "SELECT id, name, price FROM products WHERE category = ?"
cursor.execute(query, (category,))
products = cursor.fetchall()
return {"products": products}
Detection
- Trace user input: Follow HTTP request data (URL parameters, POST body, headers, cookies) through code. Verify validation occurs before use.
- Find client-side-only validation: Check for
required HTML attributes or JavaScript validation without server-side equivalents.
- Identify missing checks: Find input handling without type, length, format, or range validation.
Prevention
Apply "Validate, then Act" to all incoming data.
Related Security Patterns & Anti-Patterns
Missing input validation enables most major vulnerability classes.
References