Dela via


Säkerhets- och rasvillkor

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 avyttringsmetoden

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 program kan det vara möjligt för andra trådar att komma åt klassmedlemmar innan klasskonstruktorerna har körts helt. 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 koden cachelagrar säkerhetsinformation kontrollerar du att du granskar den för den här säkerhetsrisken.

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.

Se även