¿Por qué el SQL no se escapa / sanea de forma predeterminada?

1

Primero, dado que no hay un intercambio de pila SQL, no estoy seguro de cuál es el mejor lugar para hacer esta pregunta (debatí entre aquí y programmers.stackexchange). Si este es el lugar equivocado, muévalo.

Un defecto obvio en SQL es que las entradas no están saneadas de forma predeterminada y que las entradas del usuario pueden ejecutarse. Al diseñar SQL, seguramente los programadores deben haberse dado cuenta de este hecho? ¿Por qué entonces no pusieron ninguna protección por defecto contra ella, como escapar por defecto, o incluso mejor, volver a trabajar por completo para que las entradas de los usuarios nunca puedan ejecutarse?

Otros idiomas, ya sean compilados o interpretados, (como Java, Python, C, etc.) no parecen sufrir una vulnerabilidad similar donde se pueda ejecutar la entrada del usuario. ¿Por qué entonces el SQL es especialmente especial en este caso?

    
pregunta 1110101001 24.07.2015 - 00:42
fuente

1 respuesta

17

SQL es un lenguaje de programación. El problema no es la falta de SQL sobre "entradas de desinfección"; SQL es la entrada, no algo que recibe entradas.

El problema son las aplicaciones que se encargan de generar automáticamente algo de SQL basado en una mezcla aleatoria de elementos de cadena de origen dudoso. Una aplicación que sufre de una vulnerabilidad de inyección SQL, es una aplicación que actúa como un generador de código . Y la generación automática de código es extremadamente difícil de realizar correctamente cuando la sintaxis de destino fue destinada al consumo humano: el generador debe conocer todos los detalles arcanos del análisis y evitar todos los pequeños detalles y excepciones que están destinados a ayudar a los humanos, pero La vida es muy dura para las máquinas.

Sin embargo, cuando existe la necesidad de ejecutar sentencias SQL con parámetros provistos externamente, existe una solución limpia: se llama declaraciones preparadas . Las bases de datos SQL son compatibles y han sido compatibles con sentencias largas y preparadas. No puede culpar a SQL por "no sanear entradas" porque SQL ofrece exactamente un método para "sanear entradas"; Debes culpar a los desarrolladores por no usarlo.

(SQL puede ser culpado por un gran número de otras cosas, pero no por esta).

    
respondido por el Tom Leek 24.07.2015 - 02:30
fuente

Lea otras preguntas en las etiquetas