Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 Metodunda 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 önce bir iş parçacığı tarafından ve ardından _myObj, null olarak ayarlanmadan önce ikinci bir iş parçacığı tarafından ç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. Yanlış bertaraf, yanlış işleyici kullanımına yol açabilir ve bu da genellikle güvenlik açıklarına neden olur.
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. Bu durumun gerçekleşmesi halinde herhangi bir güvenlik sorunu olmadığından emin olmak veya gerekirse thread'leri senkronize etmek 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ıda serbest bırakan 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 bakınız
- Güvenli Kodlama Yönergeleri
- ASP.NET Çekirdek Güvenliği