Pergunta

notei o seguinte:

website Um ASP.NET MVC em desenvolvimento recebe um erro SQL "Aspas não fechadas ..." quando se faz uma chamada LINQ para um procedimento armazenado que contém SQL dinâmica.

Por exemplo:

GetEmployees SP chamados com o parâmetro [FILTER_NAME] que tem valor [n'for] lança este erro

Eu posso resolver o problema fazendo uma .replace ( "'", " ''") como este:

[Function(Name = "dbo.GetEmployees")]
public ISingleResult<EmployeeRow> GetEmployees(
            [Parameter(DbType = "NVarChar(MAX)")] string filter_name)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), filter_name.Replace("'", "''"));
    return ((ISingleResult<EmployeeRow>)(result.ReturnValue));
}

Agora, eu não sinto como ir trough todos os meus SPs e fazer isso manualmente. Existe uma maneira de fazer este uma regra geral que deve ser aplicado a todos Linq SP chama que eu tenho agora e vai fazer no futuro?

Além disso, há algo mais que eu deveria estar fugindo para evitar ataques de injeção SQL?

EDIT:

questão Adicionado: Será que este problemas dá com SPs que dont incluem sql dinâmico? Quero dizer, quando eu adicionar esse nome no banco de dados, ele será armazenado como [n''for]? Eu só percebi isso provavelmente será o caso e então eu vou ter que fazer manualmente qualquer maneira

Foi útil?

Solução 2

Eu vou dar uma resposta (possível) aqui para a minha própria pergunta. (Deixe-me saber nos comentários se você concordar)

Parece mais correto que este deve ser tratado dentro do SP. A aplicação não deve ter que se preocupar com wether uma certa SP contém SQL dinâmico ou não.

Outras dicas

Eu sugiro que você se afastar de SQL dinâmico, já que é a raiz do problema. (Eu sei que isso pode causar muitos outros problemas, porém, e pode não ser possível.)

A menos que você pode garantir que a dinâmica SQL você está construindo é seguro, (assim você controlar esta lógica internamente, com nada que está sendo passado através do usuário), que vai ser um problema.

O que aconteceria se FILTER_NAME continha um \' ou -?

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