Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Ett annat problemområde är risken för säkerhetshål som utnyttjas av rasförhållanden. Det finns flera sätt på vilka detta kan hända. Underavsnitten som följer beskriver några av de stora fallgropar som utvecklaren måste undvika.
Tävlingsförhållanden i Dispose-metoden
Om en klasss rensningsmetod (mer information finns i Skräpinsamling) inte synkroniseras, är det möjligt att rensningskoden inuti Dispose kan köras mer än en gång, som du ser i följande exempel.
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;
}
}
Eftersom den här disponeringsimplementeringen inte är synkroniserad är det möjligt Cleanup att anropas av först en tråd och sedan en andra tråd innan _myObj är inställd på null. Om det här är ett säkerhetsproblem beror på vad som händer när Cleanup koden körs. Ett stort problem med osynkroniserade disponeringsimplementeringar omfattar användning av resurshandtag, till exempel filer. Felaktig borttagning kan göra att fel handtag används, vilket ofta leder till säkerhetsrisker.
Tävlingsförhållanden i konstruktorer
I vissa applikationer kan det vara möjligt för andra trådar att komma åt klassmedlemmar innan klasskonstruktorerna har körts klart. Du bör granska alla klasskonstruktorer för att se till att det inte finns några säkerhetsproblem om detta skulle inträffa eller synkronisera trådar om det behövs.
Tävlingsförhållanden med cachelagrade objekt
Kod som cachelagrar säkerhetsinformation eller använder kodåtkomstsäkerhetsåtgärden Assert kan också vara sårbar för konkurrensvillkor om andra delar av klassen inte synkroniseras korrekt, som du ser i följande exempel.
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();
}
}
Om det finns andra sökvägar till DoOtherWork som kan anropas från en annan tråd med samma objekt kan en ej betrodd anropare glida förbi en begäran.
Om din kod cachelagrar säkerhetsinformation, se till att du granskar den med avseende på denna säkerhetsrisk.
Tävlingsförhållanden i Finalizers
Tävlingsförhållanden kan också inträffa i ett objekt som refererar till en statisk eller ohanterad resurs som den sedan frigör i sin finalizer. Om flera objekt delar en resurs som manipuleras i en klasss slutversion måste objekten synkronisera all åtkomst till den resursen.