2008-10-01 14 views
15

Tengo una situación en la que necesito usar el método ExecuteCommand de LINQ para ejecutar una inserción.¿ExecuteCommand de LINQ proporciona protección contra ataques de inyección SQL?

Algo así como (simplificado para los propósitos de esta pregunta):

object[] oParams = { Guid.NewGuid(), rec.WebMethodID }; 

TransLogDataContext.ExecuteCommand (
"INSERT INTO dbo.Transaction_Log (ID, WebMethodID) VALUES ({0}, {1})", 
oParams); 

La pregunta es si esto es una prueba de inyección SQL en la misma forma en consultas con parámetros son?

Respuesta

14

hizo una investigación, y yo encontramos este:

En mi prueba simple, parece que los parámetros pasados ​​en los executeQuery y ExecuteCommand métodos son automáticamente SQL codificados basado en el valor que se suministra . Así que si pasa una cadena con un carácter ' , automáticamente escapará a' 'SQL . Creo que una política similar se utiliza para otros tipos de datos como DateTime, decimales, etc.

http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx
(Tienes desplazamiento hacia abajo para encontrarlo)

Esto parece un poco extraño para mí - la mayoría de las otras herramientas .Net saben mejor que "SQL escape" cualquier cosa; ellos usan parámetros de consulta reales en su lugar.

+8

El comentarista, ScottGu, \ es más que un tipo cualquiera en la red! http://en.wikipedia.org/wiki/Scott_Guthrie – nathaniel

0

LINQ to SQL usa exec_sql con parámetros, que es mucho más seguro que concatenar en la cadena de consulta ad-hoc. Debe ser lo más seguro Againt inyección SQL como el uso de SqlCommand y su colección Paramaters (de hecho, es probablemente lo que LINQ to SQL utiliza internamente). Por otra parte, ¿qué tan seguro es que?

+0

SqlCommand y los parámetros son seguros a menos que el procedimiento almacenado que se llama está manipulando cadenas para procesar con sp_exec. – DamienG

Cuestiones relacionadas