SQL Injection Prevention

Preventing SQL injection attacks with prepared statements.

SQL Injection Example

# Vulnerable code (NEVER DO THIS)
const query = `SELECT * FROM users WHERE id = ${userId}`;

# Attack payload
userId = "1 OR 1=1"
# Returns ALL users

Prepared Statements (Node.js)

# Safe - using placeholders
const query = "SELECT * FROM users WHERE id = ?";
db.query(query, [userId], (err, results) => {
    # userId is safely escaped
});

# Named parameters
const query = "SELECT * FROM users WHERE email = :email";

PDO Prepared (PHP)

# Safe PDO query
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$email]);
$user = $stmt->fetch();

Python Parameterized

# Safe - using parameters
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))

# Multiple parameters
query = "INSERT INTO users (name, email) VALUES (%s, %s)"
cursor.execute(query, (name, email))

ORM (Safe)

# Sequelize (Node.js)
User.findOne({ where: { email: userEmail } });

# Django ORM (Python)
User.objects.get(email=user_email)

# Eloquent (Laravel)
User::where("email", $email)->first();

Input Validation

# Whitelist validation
const allowedFields = ["name", "email", "age"];
if (!allowedFields.includes(sortBy)) {
    throw new Error("Invalid field");
}