Guia Linguagem SQL

DevCast: Update Triggers: Como proteger tabelas de SQL Injection

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (40)  (0)

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.

14:20 min

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 ROLLBACK 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.

Sugestão de próximo conteúdo:

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?