El uso de SqlParameters
es un método recomendado para evitar la inyección de SQL en las consultas de su base de datos. ¿Dónde puedo encontrar el código/función que internamente desinfecta estos parámetros? Me gustaría volver a utilizar esta función en una implementación personalizada de la mía. Traté de encontrarlo usando Reflector, pero no tuve éxito.¿Cómo desinfecta SqlCommand los parámetros?
Respuesta
Protege contra inyección de SQL, no XSS, y no hay código o función que desinfecte los datos del parámetro.
La protección se logra al transmitir los valores de parámetros al servidor por separado de la cadena de consulta, por lo que los valores son nunca sustituidos directamente en la instrucción sql.
Así que en lugar de SQL Server se ejecuta algo como esto:
SELECT * FROM [table] WHERE [column] = ParameterValue
Es más como si funcionara algo como esto:
DECLARE @ParamValue int
-- //@ParamValue variable is populated from the framework in a safe way
SELECT * FROM [table] WHERE [column] = @ParamValue
Esto es más rápido y mucho más seguro y robusto que una función eso tendría que evaluar los datos del parámetro. Dicha función necesitaría ser muy compleja (leer: propensa a errores) para manejar cosas como custom escape characters y futuras mejoras.
Esto claramente explica el problema: los datos son datos, el código es código y nunca los dos se encontrarán.
Su comentario a la otra, ahora eliminado, respuesta:
Si paso en el valor O'Rourke, que codifica a ser O''Rourke para que no se rompa la consulta. ¿Correcto?
No, eso no es correcto. La variable se crea directamente a partir de un bloque de datos, por lo que no se necesita un escape o codificación especial.
OK, eso tiene sentido, gracias. "// La variable @ ParamValue se rellena desde el marco de forma segura" ¿cómo se puede poblar de forma segura? –
No es sql: la variable es creada por el servidor sql del bloque _data_ transmitido desde el cliente, pero se guarda en un segmento de datos y nunca se trata como código, por lo que no es necesario que se escapen o codifiquen los datos. –
¿Conoce alguna literatura detallada sobre esto? Realmente me gustaría entender todo el proceso. –
- 1. Parámetros SqlCommand tamaño confusión
- 2. Excepción de parámetros máximos de SqlCommand en 2099 parámetros
- 3. ¿Cómo desinfecta la entrada con PDO?
- 4. Reutilizando SqlCommand?
- 5. C# SqlCommand: no se pueden usar parámetros para los nombres de columnas, ¿cómo resolverlos?
- 6. Lista de cadenas en SqlCommand a través de los parámetros en C#
- 7. ¿Cuándo se deben usar "SqlDbType" y "size" al agregar los parámetros de SqlCommand?
- 8. Cómo evitar los parámetros?
- 9. SqlCommand (using/Eliminación tema)
- 10. SqlCommand o SqlDataAdapter?
- 11. ¿Cómo uso los parámetros de SQL con Python?
- 12. Parámetros nombrados con los parámetros
- 13. Parámetro In-Out para SqlCommand
- 14. Cómo usar los parámetros "@" en un comando SQL en VB
- 15. ¿Debería reutilizar los objetos SqlConnection, SqlDataAdapter y SqlCommand?
- 16. Confundido entre SqlCommand y SqlDataAdapter
- 17. Establecer un valor de base de datos para anular con un SqlCommand + parámetros
- 18. ¿Cómo obtener los parámetros de los componentes?
- 19. Cierre SqlConnection y SqlCommand C#
- 20. SQLCommand/SQLConnection vs OleDbCommand/OleDbConnection
- 21. Stored Proc y SqlCommand Timeout
- 22. Ejecutar con los parámetros
- 23. Reordenando los parámetros variables
- 24. ¿Cómo reutilizar el parámetro SqlCommand en cada iteración?
- 25. Jquery TimePicker: Cómo cambiar dinámicamente los parámetros
- 26. C#, ¿cómo obtener solo los parámetros GET?
- 27. método de cómo enumerar pasan los parámetros
- 28. ¿Cómo manejo los parámetros opcionales en Moose?
- 29. ¿Cómo codificar los parámetros de URL?
- 30. ¿Cómo veo los parámetros en una consulta?
Gran pregunta: es importante comprender cuán profunda es la seguridad que proporciona el uso de consultas parametrizadas. – RedFilter