escapar apóstrofos em chamadas de procedimento armazenado com base Linq quando SP contém SQL dinâmica
-
06-07-2019 - |
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
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 -?