¿ExecuteCommand de LINQ brinda protección contra ataques de inyección de SQL?
-
03-07-2019 - |
Pregunta
Tengo una situación en la que necesito usar el método ExecuteCommand de LINQ para ejecutar una inserción.
Algo parecido (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 a prueba de inyección SQL de la misma manera que lo son las consultas parametrizadas.
Solución
Hice una investigación, y encontré esto:
En mis pruebas simples, parece que los parámetros pasados ??en el ExecuteQuery y ExecuteCommand Los métodos son automáticamente codificados en SQL basado en el valor que se suministra. Asi que si pasas una cadena con un ' carácter, automáticamente se SQL escapar a ''. Creo una similar La política se usa para otros tipos de datos. como DateTimes, Decimales, etc.
http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx
(Tienes que desplazarte hacia abajo para encontrarlo)
Esto me parece un poco extraño: la mayoría de las otras herramientas de .Net saben que no deben " Escapar de SQL " cualquier cosa; usan parámetros de consulta reales en su lugar.
Otros consejos
LINQ to SQL usa exec_sql con parámetros, lo cual es mucho más seguro que concatenar en la cadena de consulta ad-hoc. Debería ser tan seguro contra la inyección de SQL como usar SqlCommand y su colección de parámetros (de hecho, es probablemente lo que LINQ to SQL usa internamente). Por otra parte, ¿qué tan seguro es eso ?