A mi modo de ver, los ataques de inyección SQL se pueden prevenir mediante:
- Selección, filtrado y codificación de entrada cuidadosamente (antes de la inserción en SQL)
- Uso de declaraciones preparadas / consultas parametrizadas
Supongo que hay pros y contras para cada uno, pero ¿por qué el n. ° 2 despegó y se consideró que era más o menos la forma de facto para prevenir los ataques de inyección? ¿Es más seguro y menos propenso a errores o hubo otros factores?
Según tengo entendido, si el # 1 se usa correctamente y se atienden todas las advertencias, puede ser tan efectivo como el # 2.
Desinfectante, filtrado y codificación
Hubo cierta confusión de mi parte entre lo que significaba desinfección , filtrado y codificación . Diré que para mis propósitos, todo lo anterior se puede considerar para la opción 1. En este caso, entiendo que la desinfección y el filtrado tienen el potencial de modificar o descartar los datos de entrada, mientras que la codificación conserva los datos tal cual , pero los codifica adecuadamente para evitar ataques de inyección. Creo que el escape de datos puede considerarse como una forma de codificarlo.
Consultas parametrizadas vs Biblioteca de codificación
Hay respuestas donde los conceptos de parameterized queries
y encoding libraries
que se tratan indistintamente. Corrígeme si me equivoco, pero tengo la impresión de que son diferentes.
Tengo entendido que encoding libraries
, no importa cuán buenos sean, siempre tienen el potencial de modificar el "Programa" SQL, porque están haciendo cambios en el propio SQL, antes de enviarlo al RDBMS.
Parameterized queries
por otro lado, envíe el programa SQL al RDBMS, que luego optimiza la consulta, define el plan de ejecución de la consulta, selecciona los índices que se utilizarán, etc., y luego conecta los datos, como el último paso dentro del RDBMS sí mismo.
Biblioteca de codificación
data -> (encoding library)
|
v
SQL -> (SQL + encoded data) -> RDBMS (execution plan defined) -> execute statement
Consulta parametrizada
data
|
v
SQL -> RDBMS (query execution plan defined) -> data -> execute statement
Significado historal
Algunas respuestas mencionan que históricamente, las consultas parametrizadas (PQ) se crearon por razones de rendimiento, y antes de los ataques de inyección que se volvieron populares en los problemas de codificación. En algún momento se hizo evidente que la PQ también era bastante efectiva contra los ataques de inyección. Para mantener el espíritu de mi pregunta, ¿por qué PQ siguió siendo el método de elección y por qué floreció por encima de la mayoría de los otros métodos cuando se trata de prevenir ataques de inyección SQL?