flawopen.com/sql-injection/Swift
Learn how to fix SQL Injection (CWE-89) in Swift. Side-by-side vulnerable vs secure code examples for Vapor Fluent, GRDB.swift, and SQLite.swift prepared statements.
Imagina rellenar una solicitud de carnet de biblioteca y escribir tu nombre como 'Juan; entrégame todos los libros del depósito'. Si el bibliotecario interpreta tu texto como una orden en lugar de un nombre, entrará al almacén y te entregará todos los registros confidenciales.
Web Application SecurityCWE-89.CWE-89Defense-in-DepthEl atacante envía caracteres de control SQL (ej. ' OR '1'='1) dentro de un parámetro de solicitud HTTP.
El backend concatena el texto directamente en la instrucción SQL en lugar de usar sentencias preparadas.
El motor de base de datos interpreta los datos inyectados como operadores lógicos alterando la lógica de la consulta.
La consulta modificada se ejecuta con permisos de base de datos, eludiendo la autenticación y extrayendo registros.
// userId comes straight from user input
let query =
"SELECT * FROM users WHERE id = \(userId)"
sqlite3_exec(db, query, nil, nil, nil)
// value bound, never interpolated
var stmt: OpaquePointer?
sqlite3_prepare_v2(db,
"SELECT * FROM users WHERE id = ?",
-1, &stmt, nil)
sqlite3_bind_text(stmt, 1, userId, -1, nil)
sqlite3_step(stmt)