De la forma en que lo veo, los ataques de inyección de SQL se pueden prevenir mediante:
- Selección, filtrado, entrada de codificación con cuidado (antes de la inserción en SQL)
- Usar declaraciones preparadas / consultas parametrizadas
Supongo que hay ventajas y desventajas para cada uno, pero ¿por qué despegó # 2 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 todas las advertencias están cubiertas, puede ser tan efectivo como el # 2.
Desinfección, filtrado y codificación
Hubo cierta confusión por mi parte entre lo que significaba sanitizing , filtering y encoding . Diré que para mis propósitos, todo lo anterior puede considerarse para la opción 1. En este caso, entiendo que la limpieza y el filtrado tienen el potencial de modificar o descartar los datos de entrada, mientras que la codificación de conserva los datos tal como están , pero los codifica correctamente para evitar ataques de inyección. Creo que los datos de escape pueden considerarse como una forma de codificarlos.
Consultas parametrizadas frente a la biblioteca de codificación
Hay respuestas donde los conceptos de parameterized queries
y encoding libraries
se tratan indistintamente. Corríjame si me equivoco, pero tengo la impresión de que son diferentes.
Entiendo que encoding libraries
, no importa lo buenos que sean, siempre tienen el potencial para modificar el "Programa" de SQL, porque están realizando cambios en el propio SQL, antes de enviarlo a la RDBMS.
Parameterized queries
, envía el programa SQL a RDBMS, que luego optimiza la consulta, define el plan de ejecución de la consulta, selecciona los índices que se van a utilizar, etc., y luego conecta los datos, como El último paso dentro del propio RDBMS.
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 histórico
Algunas respuestas mencionan que históricamente, las consultas parametrizadas (PQ) se crearon por razones de rendimiento, y antes de que los ataques de inyección que apuntaban a los problemas de codificación se volvieran populares. En algún momento se hizo evidente que los PQ también eran bastante efectivos contra los ataques de inyección. Para seguir con 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 los ataques de inyección SQL?