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?

Foi útil?

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 ?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top