Biztonsági és versenyfeltételek
Egy másik aggodalomra okot adó terület a versenyfeltételek által kihasznált biztonsági rések lehetősége. Ennek többféle módja is lehet. Az alábbi altopikák ismertetik a fejlesztő által elkerülendő főbb buktatókat.
Versenyfeltételek a megsemmisítési módszerben
Ha egy osztály lomtalanítási metódusa (további információkért lásd: Szemétgyűjtés) nincs szinkronizálva, lehetséges, hogy az Elidegenítésben lévő törlési kód többször is futtatható, ahogy az alábbi példában is látható.
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;
}
}
Mivel ez az Elvetés implementáció nincs szinkronizálva, lehetségesCleanup
, hogy először egy szál, majd egy második szál hívja meg, mielőtt _myObj
null értékűre lenne állítva. Attól függ, hogy ez biztonsági probléma-e, attól függ, hogy mi történik a Cleanup
kód futtatásakor. A nem aszinkron elidegenítési implementációkkal kapcsolatos egyik fő probléma az erőforrás-kezelők, például a fájlok használata. A nem megfelelő ártalmatlanítás a helytelen leíró használatát okozhatja, ami gyakran biztonsági réseket okoz.
Versenyfeltételek a konstruktorokban
Egyes alkalmazásokban előfordulhat, hogy más szálak hozzáférhetnek az osztálytagokhoz, mielőtt az osztálykonstruktorok teljesen lefutnak. Tekintse át az összes osztálykonstruktort, hogy biztosan ne legyen biztonsági probléma, ha ez bekövetkezik, vagy szükség esetén szinkronizálja a szálakat.
Versenyfeltételek gyorsítótárazott objektumokkal
A biztonsági információkat gyorsítótárazó vagy a kódhozzáférés biztonsági érvényesítése műveletet használó kód is sebezhető lehet a versenyfeltételekkel szemben, ha az osztály más részei nincsenek megfelelően szinkronizálva, ahogy az az alábbi példában is látható.
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();
}
}
Ha más elérési utak DoOtherWork
is meghívhatók ugyanahhoz az objektumhoz tartozó másik szálról, a nem megbízható hívó átcsúszhat egy igényen.
Ha a kód gyorsítótárazza a biztonsági információkat, ellenőrizze, hogy áttekinti-e a biztonsági rést.
Versenyfeltételek a Finalizersben
A versenyfeltételek olyan objektumokban is előfordulhatnak, amelyek egy statikus vagy nem felügyelt erőforrásra hivatkoznak, amelyet aztán felszabadít a véglegesítőben. Ha egy osztály véglegesítőjében manipulált erőforrás több objektumot is használ, az objektumoknak szinkronizálnia kell az adott erőforráshoz való összes hozzáférést.
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: