3

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

这些尤其是带有的HandleProcessCorruptedStateExceptions属性和CERPrepareConstrainedRegions

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

[HandleProcessCorruptedStateExceptions]
//...

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

catch阻塞的原因是什么?finally块不足以重新保护数据吗?

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

4

2 回答 2

1

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

威胁如下所示:您的库的 Visual Basic 用户在 Unprotect() 之后导致异常(甚至因内存不足而导致 OutOfMemoryException),CLR 找不到任何 catch 块,然后 CLR 执行用户的异常过滤器代码,此代码窃取 Unprotect() ed 数据,然后 CLR 才在 finally 块中执行 Protect()。

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

于 2013-09-05T05:52:06.287 回答
0

Finally块几乎总是被调用,除了在少数情况下。看

C#“最终”块总是执行吗?更多。

所以是的,保护总是在Finally.

于 2012-01-23T17:22:12.447 回答