Share via


Tetikleyici güvenliği yönetme

Varsayılan olarak, dml ve ddl Tetikleyiciler tetikleyici çağıran kullanıcının bağlamında yürütmek. Çağıran tetikleyici çalıştırmak için tetikleyici ateşlenmesine deyimini yürütür kullanıcı var. Örneğin, eğer kullanıcı Mary dml tetikleyici ateşlenmesine delete deyimi yürütür DML_trigMary içinde kod çalıştırmak için DML_trigMary yürütür kullanıcı önceliklerine bağlamında Mary. Bu varsayılan davranış, kötü amaçlı kod veritabanı veya sunucu örneği tanıtmak isteyen kullanıcılar tarafından yararlanılabilir. Örneğin, aşağıdaki ddl tetikleyici 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ütme izni olan bir kullanıcı olarak Bu tetikleyici ne demek olduğunu bir GRANT CONTROL SERVERbir üyesi gibi deyimi sysadmin sunucu rolü yürütür bir ALTER TABLEdeyimi, JohnDoeverilir CONTROL SERVERizni. Diğer bir deyişle, her ne kadar JohnDoevermek olamaz CONTROL SERVERizni kendisi için o, onu escalated ayrıcalıklarıyla yürütmesine bu izin veren tetik kodu etkin. dml ve ddl Tetikleyiciler, bu tür bir güvenlik tehdidi için açıktır.

Tetikleyici güvenlik en iyi uygulamalar

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

  • Varolan veritabanı ve sunucu örneği sorgulayarak dml ddl Tetikleyiciler haberdar sys.triggers ve sys.server_triggers katalog görünümler. Aşağıdaki sorgu tüm dml ve veritabanı düzeyinde ddl Tetikleyiciler geçerli veritabanı ve tüm sunucu düzeyinde ddl Tetikleyiciler sunucu örneği döndürür:

    SELECT type, name, parent_class_desc FROM sys.triggers
    UNION
    SELECT type, name, parent_class_desc FROM sys.server_triggers ;
    
  • Kullanım Tetikleyici devre dışı escalated ayrıcalıkları altında Tetikleyiciler yürütmek veritabanı veya sunucu bütünlüğüne zarar verme Tetikleyiciler devre dışı bırakma. Aşağıdaki deyimi geçerli veritabanındaki tüm veritabanı düzeyinde ddl Tetikleyiciler devre dışı bırakır:

    DISABLE TRIGGER ALL ON DATABASE
    

    Bu sunucu örneği üzerinde tüm sunucu düzeyinde ddl Tetikleyiciler devre dışı bırakır:

    DISABLE TRIGGER ALL ON ALL SERVER
    

    Bu deyimi 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;
    

Ayrıca bkz.

Başvuru

CREATE TRIGGER (Transact-SQL)

Diğer Kaynaklar

Designing DML Triggers

Designing DDL Triggers