Compartilhar via


Gerenciar a segurança dos gatilhos

Por padrão, os gatilhos DML e DDL são executados no contexto do usuário que chama o gatilho. O chamador de um gatilho é o usuário que executa a instrução que faz com que o gatilho seja executado. Por exemplo, se o usuário Mary executar uma instrução DELETE que faz com que o gatilho DML DML_trigMary seja executado, o código dentro de DML_trigMary será executado no contexto dos privilégios de usuário para Mary. Esse comportamento padrão pode ser explorado por usuários que desejam introduzir código mal-intencionado no banco de dados ou na instância do servidor. Por exemplo, o seguinte gatilho DDL é criado pelo usuário JohnDoe:

CREATE TRIGGER DDL_trigJohnDoe

ON DATABASE

FOR ALTER_TABLE

AS

GRANT CONTROL SERVER TO JohnDoe ;

GO

O que esse gatilho significa é que assim que um usuário que tem permissão para executar uma GRANT CONTROL SERVER instrução, como um membro da função de servidor fixa sysadmin , executa uma instrução ALTER TABLE , JohnDoe recebe CONTROL SERVER permissão. Em outras palavras, embora não possa JohnDoe conceder CONTROL SERVER permissão a si mesmo, ele habilitou o código de gatilho que lhe concede essa permissão para executar sob privilégios escalonados. Os gatilhos DML e DDL estão abertos a esse tipo de ameaça de segurança.

Práticas recomendadas de segurança de gatilho

Você pode tomar as seguintes medidas para impedir que o código de gatilho seja executado sob privilégios escalonado:

  • Esteja ciente dos gatilhos DML e DDL que existem no banco de dados e na instância do servidor consultando as visões de catálogo sys.triggers e sys.server_triggers. A consulta a seguir retorna todos os gatilhos DML e gatilhos DDL no nível de banco de dados na base de dados atual, e todos os gatilhos DDL no nível do servidor na instância do servidor.

    SELECT type, name, parent_class_desc FROM sys.triggers  
    UNION  
    SELECT type, name, parent_class_desc FROM sys.server_triggers ;  
    
  • Use DISABLE TRIGGER para desabilitar gatilhos que podem prejudicar a integridade do banco de dados ou do servidor se os gatilhos forem executados sob privilégios escalonados. A instrução a seguir desabilita todos os gatilhos DDL no nível do banco de dados atual:

    DISABLE TRIGGER ALL ON DATABASE  
    

    Esta instrução desativa todos os gatilhos DDL de nível de servidor na instância do servidor:

    DISABLE TRIGGER ALL ON ALL SERVER  
    

    Esta instrução desabilita todos os gatilhos DML no banco de dados atual:

    DECLARE @schema_name sysname, @trigger_name sysname, @object_name sysname ;  
    DECLARE @sql nvarchar(max) ;  
    DECLARE trig_cur CURSOR FORWARD_ONLY READ_ONLY FOR  
        SELECT SCHEMA_NAME(schema_id) AS schema_name,  
            name AS trigger_name,  
            OBJECT_NAME(parent_object_id) as object_name  
        FROM sys.objects WHERE type in ('TR', 'TA') ;  
    
    OPEN trig_cur ;  
    FETCH NEXT FROM trig_cur INTO @schema_name, @trigger_name, @object_name ;  
    
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
        SELECT @sql = 'DISABLE TRIGGER ' + QUOTENAME(@schema_name) + '.'  
            + QUOTENAME(@trigger_name) +  
            ' ON ' + QUOTENAME(@schema_name) + '.'   
            + QUOTENAME(@object_name) + ' ; ' ;  
        EXEC (@sql) ;  
        FETCH NEXT FROM trig_cur INTO @schema_name, @trigger_name, @object_name ;  
    END  
    GO  
    
    -- Verify triggers are disabled. Should return an empty result set.  
    SELECT * FROM sys.triggers WHERE is_disabled = 0 ;  
    GO  
    
    CLOSE trig_cur ;  
    DEALLOCATE trig_cur;  
    

Consulte Também

CREATE TRIGGER (Transact-SQL)
Gatilhos DML
Gatilhos DDL