¿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,)) # BOpciones
- A es más rápido, porque se salta el manejo de parámetros
- B evita la SQL injection, porque los valores viajan aparte del texto SQL (Opción correcta)
- Son equivalentes en seguridad y comportamiento
- 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.