ExecuteCommand do LINQ fornecer proteção contra ataques de injeção SQL?
-
03-07-2019 - |
Pergunta
Eu tenho uma situação onde eu preciso usar o método ExecuteCommand do LINQ para executar uma inserção.
Algo como (simplificado para os fins desta questão):
object[] oParams = { Guid.NewGuid(), rec.WebMethodID };
TransLogDataContext.ExecuteCommand (
"INSERT INTO dbo.Transaction_Log (ID, WebMethodID) VALUES ({0}, {1})",
oParams);
A questão é se isso é SQL injeção prova da mesma forma parametrizada consultas são?
Solução
fiz alguma pesquisa, e eu encontrei isto:
No meu teste simples, parece que os parâmetros passados ??no ExecuteQuery e ExecuteCommand métodos são automaticamente SQL codificado com base no valor que está sendo fornecido. assim se você passar uma cadeia com um ' caráter, ele será automaticamente SQL escapar-lo para ''. Eu acredito que uma semelhante política é utilizado para outros tipos de dados como DateTimes, decimais, etc.
http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx
(Você tem caminho de rolagem para encontrá-lo)
Isto parece um pouco estranho para mim - a maioria outras ferramentas .Net sabe melhor do que qualquer coisa "SQL escape"; eles usam parâmetros de consulta reais em vez.
Outras dicas
LINQ to SQL usos exec_sql com os parâmetros, o que é muito mais seguro do que concatenar na string de consulta ad-hoc. Deve ser como injeção de SQL againt seguro quanto usar SqlCommand e sua coleção Paramaters (na verdade, é provavelmente o que LINQ to SQL usa internamente). Então, novamente, o quão seguro é que ?