Gestione della sicurezza dei triggerManage Trigger Security

Per impostazione predefinita, i trigger DML e DDL vengono eseguiti nel contesto dell'utente che li chiama.By default, both DML and DDL triggers execute under the context of the user that calls the trigger. Il chiamante di un trigger è l'utente che esegue l'istruzione che causa l'esecuzione del trigger.The caller of a trigger is the user that executes the statement that causes the trigger to run. Se ad esempio l'utente Mary esegue un'istruzione DELETE che causa l'esecuzione del trigger DML DML_trigMary , il codice all'interno di DML_trigMary viene eseguito nel contesto dei privilegi utente relativi a Mary.For example, if user Mary executes a DELETE statement that causes DML trigger DML_trigMary to run, the code inside DML_trigMary executes in the context of the user privileges for Mary. Il funzionamento predefinito può essere sfruttato dagli utenti che desiderano introdurre malware nel database o nell'istanza del server.This default behavior can be exploited by users who want to introduce malicious code in the database or server instance. Ad esempio, il trigger DDL seguente viene creato dall'utente JohnDoe:For example, the following DDL trigger is created by user JohnDoe:

CREATE TRIGGER DDL_trigJohnDoe

ON DATABASE

FOR ALTER_TABLE

AS

GRANT CONTROL SERVER TO JohnDoe ;

GO

Il trigger indica che non appena un utente che dispone dell'autorizzazione per l'esecuzione di un'istruzione GRANT CONTROL SERVER , ad esempio un membro del ruolo predefinito del server sysadmin , esegue un'istruzione ALTER TABLE , all'utente JohnDoe viene concessa l'autorizzazione CONTROL SERVER .What this trigger means is that as soon as a user that has permission to execute a GRANT CONTROL SERVER statement, such as a member of the sysadmin fixed server role, executes an ALTER TABLE statement, JohnDoe is granted CONTROL SERVER permission. In altre parole, anche se JohnDoe non può concedere l'autorizzazione CONTROL SERVER a se stesso, ha abilitato il codice del trigger che gli concede tale autorizzazione per l'esecuzione con privilegi con escalation.In other words, although JohnDoe cannot grant CONTROL SERVER permission to himself, he enabled the trigger code that grants him this permission to execute under escalated privileges. I trigger DML e DDL sono esposti a questo tipo di minaccia per la sicurezza.Both DML and DDL triggers are open to this kind of security threat.

Procedure consigliate per la sicurezza dei triggerTrigger Security Best Practices

Per impedire l'esecuzione del codice del trigger con privilegi alzati di livello, è possibile adottare le misure seguenti:You can take the following measures to prevent trigger code from executing under escalated privileges:

  • Individuare i trigger DML e DDL esistenti nel database e nell'istanza del server eseguendo query sulle viste del catalogo sys.triggers e sys.server_triggers .Be aware of the DML and DDL triggers that exist in the database and on the server instance by querying the sys.triggers and sys.server_triggers catalog views. La query seguente restituisce tutti i trigger DML e DDL a livello di database nel database corrente e tutti i trigger DDL a livello di server nell'istanza del server:The following query returns all DML and database-level DDL triggers in the current database, and all server-level DDL triggers on the server instance:

    SELECT type, name, parent_class_desc FROM sys.triggers  
    UNION  
    SELECT type, name, parent_class_desc FROM sys.server_triggers ;  
    
  • Per disabilitare i trigger che possono compromettere l'integrità del database o del server se vengono eseguiti con privilegi alzati di livello, usare DISABLE TRIGGER .Use DISABLE TRIGGER to disable triggers that can harm the integrity of the database or server if the triggers execute under escalated privileges. L'istruzione seguente disabilita tutti i trigger DDL a livello di database nel database corrente:The following statement disables all database-level DDL triggers in the current database:

    DISABLE TRIGGER ALL ON DATABASE  
    

    L'istruzione seguente disabilita tutti i trigger DDL a livello di server nell'istanza del server:This statement disables all server-level DDL triggers on the server instance:

    DISABLE TRIGGER ALL ON ALL SERVER  
    

    L'istruzione seguente disabilita tutti i trigger DML nel database corrente:This statement disables all DML triggers in the current database:

    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;  
    

Vedere ancheSee Also

CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
Trigger DML DML Triggers
Trigger DDL DDL Triggers