Aracılığıyla paylaş


Güvenlik ve Yarış Durumları

Bir diğer endişe alanı da yarış koşullarından yararlanılan güvenlik açıkları potansiyelidir. Bunun çeşitli yolları vardır. İzleyen alt konu konuları, geliştiricinin kaçınması gereken bazı önemli tuzakları özetler.

Dispose Yönteminde Yarış Koşulları

Bir sınıfın Dispose yöntemi (daha fazla bilgi için bkz. Çöp Toplama) eşitlenmemişse, aşağıdaki örnekte gösterildiği gibi Dispose içindeki temizleme kodunun birden çok kez çalıştırılabilmesi mümkündür.

Sub Dispose()  
    If Not (myObj Is Nothing) Then  
       Cleanup(myObj)  
       myObj = Nothing  
    End If  
End Sub  
void Dispose()
{  
    if (myObj != null)
    {  
        Cleanup(myObj);  
        myObj = null;  
    }  
}  

Bu Dispose uygulaması eşitlenmediğinden, Cleanup ilk bir iş parçacığı tarafından çağrılabilir ve ardından null olarak ayarlanmadan önce _myObj ikinci bir iş parçacığı çağrılabilir. Bunun bir güvenlik sorunu olup olmadığı, kod çalıştırıldığında Cleanup ne olacağına bağlıdır. Eşitlenmemiş Dispose uygulamalarıyla ilgili önemli bir sorun, dosyalar gibi kaynak tanıtıcılarının kullanılmasını içerir. Hatalı kullanım yanlış tanıtıcının kullanılmasına neden olabilir ve bu da genellikle güvenlik açıklarına yol açar.

Oluşturucularda Yarış Koşulları

Bazı uygulamalarda, sınıf oluşturucuları tamamen çalışmadan önce diğer iş parçacıklarının sınıf üyelerine erişmesi mümkün olabilir. Bunun olması durumunda herhangi bir güvenlik sorunu olmadığından emin olmak veya gerekirse iş parçacıklarını eşitlemek için tüm sınıf oluşturucularını gözden geçirmeniz gerekir.

Önbelleğe Alınmış Nesnelerle Yarış Koşulları

Aşağıdaki örnekte gösterildiği gibi, güvenlik bilgilerini önbelleğe alan veya kod erişimi güvenliği Assert işlemini kullanan kod, sınıfın diğer bölümleri uygun şekilde eşitlenmemişse yarış koşullarına karşı da savunmasız olabilir.

Sub SomeSecureFunction()  
    If SomeDemandPasses() Then  
        fCallersOk = True  
        DoOtherWork()  
        fCallersOk = False  
    End If  
End Sub  
  
Sub DoOtherWork()  
    If fCallersOK Then  
        DoSomethingTrusted()  
    Else  
        DemandSomething()  
        DoSomethingTrusted()  
    End If  
End Sub  
void SomeSecureFunction()
{  
    if (SomeDemandPasses())
    {  
        fCallersOk = true;  
        DoOtherWork();  
        fCallersOk = false;  
    }  
}  
void DoOtherWork()
{  
    if (fCallersOK)
    {  
        DoSomethingTrusted();  
    }  
    else
    {  
        DemandSomething();  
        DoSomethingTrusted();  
    }  
}  

Aynı nesneye sahip başka bir iş parçacığından çağrılabilecek başka yollar DoOtherWork varsa, güvenilmeyen bir çağıran talebin üzerine kayabilir.

Kodunuz güvenlik bilgilerini önbelleğe alırsa, bu güvenlik açığı için bu bilgileri gözden geçirmeyi unutmayın.

Finalizer'larda Yarış Koşulları

Yarış koşulları, statik veya yönetilmeyen bir kaynağa başvuran ve ardından sonlandırıcısında serbest olan bir nesnede de oluşabilir. Bir sınıfın sonlandırıcısında manipüle edilen bir kaynağı birden çok nesne paylaşıyorsa, nesnelerin bu kaynağa tüm erişimi eşitlemesi gerekir.

Ayrıca bkz.