Você pode fazer com que o MS Sql Server rejeite todas as consultas que correspondam a um determinado padrão?

1

Eu gostaria de saber se você pode fazer o Sql Server examinar as strings de consulta recebidas e rejeitar aquelas que correspondam a um determinado padrão. Em outras palavras, para uma determinada classe de consultas (talvez identificadas por uma expressão regular), desejo saber se o Sql Server poderia retornar uma mensagem de erro em vez de processá-las como normalmente faria.

Para ser mais concreto e fornecer um possível caso de uso, considere este descrição de um ataque de injeção de Sql . Se o meu site sofresse um ataque constante de técnicas nesse sentido, e se obter o site corrigido parecesse um processo demorado, seria tentador (se o Sql permitisse) tentar obter algum alívio provisório colocando algo no Sql que basicamente dizia

If a query matches regex CAST(0x[0-9A-Za-z]{20,} then don't execute it!

Meu palpite é que, se esse tipo de filtragem for possível, fazer isso exigiria a gravação de algum tipo de DLL personalizada do Sql Server Add-In. Mas talvez você possa fazer algo assim com os recursos de auditoria integrados do Sql Server 2008? Eu realmente não tenho ideia, e não tenho certeza de onde na documentação seria o melhor lugar para começar a procurar.

Se você quiser apontar porque o banco de dados é um lugar estúpido para tentar bloquear ataques de injeção SQL, tudo bem. Mas minha principal questão não é se é uma boa ideia neste caso de uso específico, mas se esse tipo de filtragem de consulta / rejeição é possível.

    
por Chris 06.08.2009 / 02:11

3 respostas

2

Seu palpite estava correto: o banco de dados é o lugar errado para resolver esse problema. A razão pela qual as injeções de SQL funcionam é porque os comandos são SQL válidos. Geralmente, no momento em que seu aplicativo passa a consulta para o servidor de banco de dados, os caracteres especiais foram transformados novamente em texto normal.

Se você não quiser mitigar isso no nível do aplicativo, deve procurar soluções de firewall de software, como o dotDefender. Na minha opinião, isso também está atacando o problema no lugar errado e, eventualmente, algo passará pela lógica do firewall.

    
por 06.08.2009 / 02:34
3

Não, você não pode ter instruções de rejeição do servidor SQL com base em alguma correspondência de padrão. Que tal negar privilégios SELECT a todos os usuários e forçá-los a usar procedimentos armazenados que você cria para acessar dados em suas tabelas subjacentes? Contanto que você faça um bom trabalho validando as entradas para os sprocs, você deve estar razoavelmente seguro.

    
por 06.08.2009 / 07:25
1

Não, não há como ter os comandos de rejeição do SQL Server com base em uma correspondência de padrão. Para fazer algo assim, você teria que escrever um ouvinte para aceitar os comandos SQL, verificá-los e depois passá-los para o mecanismo de banco de dados para execução.

Você estaria muito melhor lidando com isso na camada de aplicativos.

    
por 06.08.2009 / 03:42