¿Puedo evitar todos los ataques de inyección SQL mediante el uso de parámetros?
¿Y no se preocupe por nada en la inyección de SQL en este caso?
¿O hay algunos tipos de estos ataques que requieren más cuidado por parte del programador?¿Puedo evitar todos los ataques de inyección SQL mediante el uso de parámetros?
Respuesta
No, no puede evitar todos los ataques de inyección SQL mediante el uso de parámetros. SQL dinámico es el problema real, y esto puede ocurrir tanto en los procedimientos almacenados como en el código de la aplicación.
por ejemplo, este es propenso a un ataque de inyección SQL: consulta parametrizada pasa un nombre de usuario para un procedimiento almacenado, y dentro del procedimiento almacenado del parámetro se concatena con un comando SQL y luego ejecutado.
Para ver un ejemplo de muchos tipos de ataques de inyección SQL, consulte este SQL Injection Cheat Sheet. Verá que simplemente escapando comillas simples está rascando la superficie, y que hay muchas formas de evitarlo.
Si va a construir una consulta SQL dinámica con esos parámetros (pasados a un procedimiento almacenado, por ejemplo), entonces existe la posibilidad de inyección sql si no se toman precauciones.
Sí y no. Sí, si todas las declaraciones SQL son estáticas y solo usan parámetros, entonces estás 100% protegido contra ataques de inyección SQL.
El problema surge cuando los parámetros mismos se utilizan para construir sentencias SQL dinámicas. Un ejemplo sería un procedimiento almacenado que genera una instrucción SQL de forma dinámica para consultar una multitud de opciones diferentes, donde una única instrucción monolítica sería poco práctica. Si bien hay mejores soluciones para este problema, este es un problema común.
100%, es decir, suponiendo que MS o Novell no cometieron ningún error. –
Siempre puede minimizar el riesgo de inyección SQL mediante el uso de declaraciones preparadas, siempre que su motor de base de datos las admita.
De todos modos, las declaraciones preparadas son probablemente la forma más segura de bloquear las inyecciones de SQL.
Sí, puede evitar todos los ataques de inyección SQL mediante el uso de parámetros, siempre que use parámetros exclusivamente en la pila de llamadas. Por ejemplo:
- El código de su aplicación llama a un procedimiento almacenado o SQL dinámico en la base de datos. Eso debe usar parámetros para pasar todos los valores.
- El procedimiento almacenado o SQL dinámico construye internamente una llamada a otro procedimiento almacenado o declaración de SQL dinámico. Eso también debe usar parámetros para pasar todos los valores.
- Repite ad infinitum hasta que te quedes sin código.
Si está programando en SQL Server, puede usar sp_executesql
para ejecutar SQL dinámico, y le permitirá definir y pasar valores parametrizados a la instrucción que se está ejecutando.
+1 Creo que la gente olvida que puede usar parámetros con SQL dinámico. – dotjoe
El problema es construir la instrucción SQL dinámicamente.
Por ejemplo, es posible que desee ordenar el resultado en función de la columna que seleccionó el usuario. En la mayoría de las bases de datos, no puede usar parámetros aquí ("¿ORDEN POR?" No funciona). Entonces tienes que "ORDER BY" + columna. Ahora, si "columna" es una Cadena, entonces el usuario de su aplicación web podría inyectar código allí (lo cual no es fácil, pero es posible).
- 1. ¿Cómo puedo evitar los ataques de inyección SQL en mi aplicación ASP.NET?
- 2. ¿Las declaraciones preparadas evitarán los ataques de inyección sql?
- 3. ¿Son posibles los ataques de inyección SQL en JPA?
- 4. ¿Cómo verifica su URL para los ataques de inyección SQL?
- 5. ¿ExecuteCommand de LINQ proporciona protección contra ataques de inyección SQL?
- 6. ¿Cómo evitar la inyección SQL en una consulta SQL con el operador Like utilizando los parámetros?
- 7. ¿Es htmlencoding una solución adecuada para evitar ataques de inyección SQL?
- 8. Sanitize $ _GET parámetros para evitar XSS y otros ataques
- 9. Cómo prevenir los ataques de inyección de JavaScript
- 10. ¿Spring JDBC brinda protección contra ataques de inyección SQL?
- 11. SQL Server: Desinfección @param contra ataques de inyección
- 12. Es urlencode() lo suficientemente bueno como para detener todos los ataques de inyección SQL en el año 2011
- 13. ¿cómo puedo evitar la inyección de SQL con ColdFusion
- 14. ¿Cómo puedo probar mi sitio web para detectar ataques de inyección de SQL?
- 15. ¿Puede mysql_real_escape_string ALONE prevenir todos los tipos de inyección sql?
- 16. Sanitize nombre de tabla/columna en SQL dinámico en .NET? (Impedir ataques de inyección SQL)
- 17. ¿Cómo puedo evitar la inyección de DLL
- 18. ¿Es sqlite3_bind_text suficiente para evitar la inyección de SQL en el iPhone
- 19. Prevención de la inyección SQL en Ibatis
- 20. Evitar el uso de ADO.NET sp_executesql
- 21. Cómo evitar los parámetros?
- 22. Consulta JPA - inyección sql en parámetros posicionales jpa consulta nativa
- 23. Inyección de ASP SQL clásica
- 24. Cómo limpiar SQL dinámico en SQL Server: evitar la inyección SQL
- 25. ¿Función de formato frente a parámetros en los escenarios de inyección sql?
- 26. ¿Dónde usar mysql_real_escape_string para evitar la inyección SQL?
- 27. Prevención de ataques de inyección en la línea de comandos
- 28. ¿Cómo evitar aplicaciones de ataques XSS?
- 29. simplificar la instrucción SQL mediante el uso de CTE
- 30. ¿Cómo uso los parámetros de SQL con Python?
¿cuál es la solución? –
@MH: reemplazando todos 'con' ' –
La solución es nunca usar SQL dinámico. Si esto no es posible, debe llegar a extremos extremos para asegurarse de que escapa correctamente cualquier cadena que se concatenará a una declaración de SQL, y también considerar cómo la cadena se organiza en todos los dominios (por ejemplo, HTML -> Javascript - -> codificación URL ->), ya que puede haber complicaciones adicionales debido a esas transformaciones. – RedFilter