Repaso
English

¿Por qué se prefieren las consultas parametrizadas al formateo de strings?

cur.execute(f"SELECT * FROM users WHERE name = '{name}'")   # A
cur.execute("SELECT * FROM users WHERE name = %s", (name,))  # B

Opciones

  1. A es más rápido, porque se salta el manejo de parámetros
  2. B evita la SQL injection, porque los valores viajan aparte del texto SQL (Opción correcta)
  3. Son equivalentes en seguridad y comportamiento
  4. B solo funciona en SQLite y no en otras bases de datos

Respuesta

B evita la SQL injection porque los valores se envían aparte del texto SQL

Por qué

En A, la entrada del usuario pasa a formar parte del código SQL. Si name es ' OR '1'='1, la consulta devuelve todos los usuarios. Ese ataque es SQL injection.

En B, el SQL y el valor viajan por separado; la base de datos siempre trata name como dato, nunca como código.

Nunca construyas SQL con f-strings a partir de entradas del usuario.

Recuerda

Pasa siempre los valores como parámetros, nunca dentro del string SQL.

Términos clave

Practica esta pregunta en Repaso