损坏状态异常处理的可靠性

时间:2012-01-23 14:48:34

标签: c# .net reliability try-catch-finally

我目前正在研究 C# / .NET 的可靠性功能和异常处理

这些特别是HandleProcessCorruptedStateExceptions属性和带有PrepareConstrainedRegions CER

现在我正在阅读SecureString类的参考源代码,因为这是一个非常安全的地方,即使在特殊情况下也能保持数据加密,并找到类似这样的地方:

[HandleProcessCorruptedStateExceptions]
//...

    RuntimeHelpers.PrepareConstrainedRegions();
    try
    {
        Unprotect();
        // ...
    }
    catch(Exception)
    {
        Protect();
        throw;
    }
    finally
    {
        Protect();
        // ...
    }

catch阻止的原因是什么? finally块是否足以重新保护数据?

或者那些损坏的状态异常是否只会影响catch并在之后终止应用程序?

2 个答案:

答案 0 :(得分:1)

由于异常过滤功能中的安全漏洞(不是由C#提供,但Visual Basic和其他人提供),因此需要在catch块中进行代码重复。它允许恶意用户在捕获异常之后和最终执行块之前在try-catch-finally块中执行其代码。

威胁看起来像这样:你的库的Visual Basic用户在Unprotect()之后导致异常(甚至OutOfMemoryException因内存不足),CLR找不到catch块,然后CLR执行用户的异常过滤器代码,此代码窃取Unprotect() -ed数据,然后CLR才在finally块中执行Protect()。

因此,将安全清理代码放在catch和finally块中,通常清理只停留在最终。

答案 1 :(得分:0)

除少数情况外,几乎总是调用

Finally个块。参见

Does the C# "finally" block ALWAYS execute?了解更多信息。

所以是的,保护总是在Finally中调用。