No usar AddWithValue en .Net
Hoy, leyendo sobre SQL Injection preparándome para una entrevista que ocurrirá dentro de una hora aproximadamente, me acordé del método AddWithValue y de por qué no debe usarse.
Antes, un poco de contexto.
SQL Injection es "inyectar" código SQL dentro de los valores del sistema para que este se termine por ejecutar en tu motor de base de datos.
En la imagen de arriba, el "usuario" (en este caso un conductor) del sistema (en este caso un lector OCR de placas de autos), incluye el caracter de control apóstrofe o comilla simple para "cerrar" la consulta que ocurría.
Ahora, para evitar SQL Injection, una de las medidas más comunes es utilizar la herramienta que SQLCommand que viene en el .Net Framework en System.Data.SqlClient, donde se especifica el tipo de comando a ejecutar, los parámetros, sus tipos y sus valores... o al menos, así debería ser. Y ahí es donde vienen los problemas: el AddWithValue.
El AddWithValue es muy cómodo porque en una sola línea agregas al parámetro y su valor. La bronca aquí viene con la posible pérdida de valores al hacer auto conversión de, por ejemplo, flotante a object y luego a money o decimal, o de string a object y luego a varchar. También cuando el tamaño de la base de datos sea muy grande o la cantidad de datos a enviar porque al procesar los valores se realiza la conversión... y esto ocurre por cada dato.
Simplemente me acordé de eso. No sé si haya mejorado, mi experiencia es de aproximadamente 2011.