Aracılığıyla paylaş


Tetikleyici güvenliği yönetme

Varsayılan olarak, DML hem DDL tetikleyen yürütmek tetikleyici çağıran kullanıcının bağlamında.Arayan bir tetikleyici, tetikleyici çalışmasına neden olan deyimini yürütür kullanıcıdır.Örneğin, kullanıcıGamze neden DML tetikleyicisi DML_trigMary çalıştırmak DELETE deyim yürütür, kod içinde DML_trigMary için kullanıcı ayrıcalıkları bağlamında yürüten CAN . Bu varsayılan davranışı veritabanı veya sunucu örnek, kötü amaçlı kod tanıtmak isteyen kullanıcılar tarafından yararlanılabilir.Örneğin, aşağıdaki DDL tetikleyicisi oluşturulur kullanıcı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 birGRANT CONTROL SERVERdeyim, bir üyesi olarakSistem Yöneticisi sabit sunucu rolü, yürütür bir ALTER TABLEdeyim JohnDoeverilmiş CONTROL SERVERizni.Diğer bir deyişle, ancakJohnDoeolamaz verinCONTROL SERVERkendisi izni, kendisine bu izin veren tetikleyici kodunda etkin kendisine yürütmek altındaki ayrıcalıklar. escalatedBu tür bir güvenlik tehdidi DML hem DDL Tetikleyiciler açıktır.

Tetikleyici en iyi güvenlik yöntemleri

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

  • Veritabanında ve sunucu üzerinde bulunan DML ve DDL Tetikleyiciler haberdar örnek sorgulamaktriggersys.server_triggers katalog görünümleri. Aşağıdaki sorgu tüm DML ve veritabanı düzey DDL Tetikleyiciler geçerli veritabanı ve tüm sunucu düzeyindeki DDL Tetikleyiciler sunucuda verir örnek:

    SELECT type, name, parent_class_desc FROM sys.triggers
    UNION
    SELECT type, name, parent_class_desc FROM sys.server_triggers ;
    
  • KullanımıDevre dışı bırakırsanız TRIGGER escalated ayrıcalıkları. Tetikleyiciler altında çalıştırmak veritabanı veya sunucunun bütünlüğü zarar verebilir, tetikleyici devre dışı bırakmak için Aşağıdaki deyim tüm veritabanı-düzey DDL Tetikleyiciler geçerli veritabanında devre dışı bırakır:

    DISABLE TRIGGER ALL ON DATABASE
    

    Bu deyim, sunucu üzerindeki tüm sunucu düzeyindeki DDL tetikleyiciler devre dışı bırakır:

    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;