¿El uso de SqlCommand parametrizado hace que mi progtwig sea inmune a la inyección de SQL?

Soy consciente de que la inyección SQL es bastante peligrosa . Ahora en mi código C # compongo consultas parametrizadas con la class SqlCommand :

 SqlCommand command = ...; command.CommandText = "SELECT * FROM Jobs WHERE JobId = @JobId;"; command.Parameters.Add("@JobId", SqlDbType.UniqueIdentifier ).Value = actualGuid; command.ExecuteNonQuery(); 

¿Esto automáticamente hará que mi código sea inmune a la inyección de SQL? ¿Tengo que hacer algo extra?

Diría que para su ejemplo particular, y probablemente canónico, para consultas parametrizadas, sí, es suficiente.

Sin embargo, las personas a veces escriben código como este

 cmd.CommandText = string.Format("SELECT * FROM {0} WHERE col = @col;", tableName); cmd.Parameters.Add("@col", ...); 

porque simplemente no hay forma de pasar el nombre de la tabla como un parámetro y el deseo de hacer existe a veces – equivocado o no. Parece que a menudo se pasa por alto, que tableName (a less que tal vez solo se lea de un set de valores estáticos / constantes que no se derivan de ninguna input) de hecho permite la inyección de SQL.

De acuerdo con la Nota sobre este artículo de MSDN , "los caracteres de input especiales representan una amenaza solo con SQL dynamic y no cuando se usa SQL parametrizado".

Por lo tanto, creo que está a salvo de la inyección de SQL. Puede haber algunos riesgos lógicos al usar identificadores como Idendity Values ​​en sus URL, pero esta es otra historia.

La inyección de SQL depende principalmente de la ejecución de SQL dynamic. En otras palabras, declaraciones SQL construidas por la concatenación de SQL con valores ingresados ​​por el usuario.

Para evitar la inyección de SQL por completo,

Protegerse contra ataques de inyección SQL no es muy difícil. Las aplicaciones que son inmunes a ataques de inyección SQL validan y desinfectan todas las inputs de los usuarios, nunca usan SQL dynamic, ejecutan usando una count con pocos privilegios, hash o encriptan sus secretos, y presentan posts de error que revelan poca o ninguna información útil para el hacker. Al seguir un enfoque de varias capas para la prevención, puede estar seguro de que si se elude una defensa, seguirá estando protegido.

Desde MSDN

Al utilizar SqlCommand una muy buena práctica y siempre que no concatene cadenas de SQL en cualquier lugar (incluso dentro de cualquier procedimiento almacenado que llame, es decir, evite el SQL dynamic), será inmune a los ataques de inyección de SQL.

No es inmune a la inyección de SQL si usa sql dynamic, incluso si lo pasa a través de parameters. Lástima que SQL Server no tenga una function incorporada para desinfectar los parameters