Tetikleyici güvenliği yönetme

Varsayılan olarak, dml hem ddl tetikler yürütmek tetikleyicisini çaırır kullanıcı bağlamında.Tetikleyici arayan yürütür kullanıcı olan deyim tetikleyicinin çalışabilmesi için neden olur.Örneğin, kullanıcı Mary DML tetikleyicisi olur bir delete deyim yürütür DML_trigMary çalıştırmak için kod içinde DML_trigMary için kullanıcı ayrıcalıkları bağlamında yürüten Mary.Bu varsayılan davranış, kötü amaçlı kod veritabanı veya sunucu örnek tanıtmak isteyen kullanıcılar tarafından yararlanılabilir.Örneğin, aşağıdaki DDL tetikleyicisi kullanıcı tarafından oluşturulan JohnDoe:

CREATE TRIGGER DDL_trigJohnDoe

ON DATABASE

FOR ALTER_TABLE

AS

GRANT CONTROL SERVER TO JohnDoe ;

GO

yürütmek izni olan bir kullanıcı olarak bu tetikleyici anlamı olan bir GRANT CONTROL SERVER üye gibi deyim sysadmin sabit sunucu rolü yürütür bir ALTER TABLE deyim, JohnDoe verilmiş CONTROL SERVER izni.Başka bir deyişle, ancak JohnDoe edemiyor vermek CONTROL SERVER kendisi için izni olan verir ona escalated ayrıcalıkları altında yürütmek için bu izni Tetikleyici kodunda etkin heBu tür bir güvenlik tehdidi dml hem ddl Tetikleyiciler açıktır.

En iyi güvenlik yöntemleri, tetikleyici

Tetikleyici kod escalated ayrıcalıklarıyla yürütmesine engel olmak için aşağıdaki önlemleri alabilir:

  • Veritabanında ve sunucu üzerinde mevcut dml ve ddl Tetikleyiciler haberdar örnek sorgulamak trigger ve sys.server_triggers katalog görünümleri.Aşağıdaki sorgu tüm dml ve veritabanı - verirdüzey ddl Tetikleyiciler geçerli veritabanı ve tüm sunucu -düzey sunucu örnek üzerinde ddl Tetikleyiciler:

    SELECT type, name, parent_class_desc FROM sys.triggers
    UNION
    SELECT type, name, parent_class_desc FROM sys.server_triggers ;
    
  • Use Tetikleyici devre dışı aktarılana ayrıcalıkları altında Tetikleyiciler yürütmek veritabanı veya sunucunun bütünlük zarar verebilir, tetikleyiciler devre dışı bırakma.Aşağıdaki deyim veritabanı tüm - devre dışı bırakırdüzey geçerli veritabanında ddl Tetikleyiciler:

    DISABLE TRIGGER ALL ON DATABASE
    

    Bu deyim tüm sunucu - devre dışı bırakırdüzey sunucu örneği üzerinde ddl Tetikleyiciler:

    DISABLE TRIGGER ALL ON ALL SERVER
    

    Bu deyim geçerli veritabanındaki tüm dml tetikleyiciler devre dışı bırakır:

    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;