Update Triggers: Como proteger tabelas de SQL Injection

Veja neste DevCast como implementar uma trigger que servirá de segunda camada de segurança no banco de dados e aprenda a garantir a segurança necessária para executar o comando update.

Veja neste DevCast como implementar uma trigger que servirá de segunda camada de segurança no banco de dados e aprenda a garantir a segurança necessária para executar o comando update. Caso o seu código falhe ao proteger o aplicativo de um ataque por SQL Injection ou até mesmo de um update sem a instrução where, esse recurso nativo do banco de dados pode impedir que informações sejam perdidas.

Consulta rápida:

ALTER TRIGGER [dbo].[SafeUpdate] ON [prova].[dbo].[usuarios] FOR UPDATE AS DECLARE @PWD INT, @ID INT BEGIN SET NOCOUNT ON SELECT @PWD = pwd, @ID = id FROM inserted IF(@ID IS NULL) BEGIN RAISERROR('%d nao e um dado valido', 16, 0, @PWD) ROLLBACK TRANSACTION RETURN END IF(@PWD <> 0x01010101 OR @PWD IS NULL) BEGIN RAISERROR('%d operacao nao permitida', 16, 0, @PWD) ROLLBACK TRANSACTION RETURN END UPDATE dbo.usuarios SET pwd = NULL WHERE id = @ID END

Cria uma Trigger para o comando UPDATE.

As variáveis @PWD e @ID serão utilizadas para armazenar a senha e o ID do registro que será atualizado no banco, respectivamente.

Caso o ID não seja informado no comando UPDATE é lançado um erro seguido de um comando de ROLLBACKv e do encerramento da Trigger sem que nenhum registro seja de fato alterado.

Caso PWD não seja informado no comando UPDATE ou seja diferente daquela esperada pela Trigger, é lançado um erro seguido de um comando de ROLLBACK e do encerramento da Trigger sem que nenhum dado seja alterado.

Caso a atualização seja gravada no banco, após isso, o campo PWD da tabela retorna ao valor NULL através da última instrução UPDATE na Trigger. Por essa razão também utilizamos o comando SET NOCOUNT ON no início da Trigger, para que esse UPDATE não seja levado em consideração pelo banco de dados no momento de contabilizar o total de comandos executados com sucesso.

ALTER TRIGGER [dbo].[SafeUpdateWhere] ON [prova].[dbo].[usuarios] FOR UPDATE AS DECLARE @COUNT INT BEGIN SELECT @COUNT = COUNT(*) FROM inserted IF(@COUNT > 1) BEGIN RAISERROR('%d operacao nao permitida', 16, 0, @COUNT) ROLLBACK TRANSACTION END END

Declaramos a variável COUNT que será responsável por armazenar o total de linhas afetadas pelo comando UPDATE. Esse contador vem da tabela especial INSERTED do SQL Server.

Caso o total de linhas afetadas seja maior que um, lançamos um erro e solicitamos ROLLBACK para que nenhum registro seja de fato atualizado.

Confira também

Artigos relacionados