2009-05-29 10 views
10

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?

+0

Gran pregunta: es importante comprender cuán profunda es la seguridad que proporciona el uso de consultas parametrizadas. – RedFilter

Respuesta

24

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.

+0

OK, eso tiene sentido, gracias. "// La variable @ ParamValue se rellena desde el marco de forma segura" ¿cómo se puede poblar de forma segura? –

+0

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. –

+0

¿Conoce alguna literatura detallada sobre esto? Realmente me gustaría entender todo el proceso. –

Cuestiones relacionadas