2012-01-23 4 views
3

Я в настоящее время изучает особенности надежности и обработки исключений C#/.NETНадежность испорченного состояния обработки исключений

Это особенно HandleProcessCorruptedStateExceptions атрибутов и CER s с PrepareConstrainedRegions.

Теперь я читал ссылки исходного кода SecureString класса, так как это место, где высоко безопасность важно сохранить данные зашифрованы даже в исключительных ситуациях, и нашел места подобных, как это:

[HandleProcessCorruptedStateExceptions] 
//... 

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

В чем причина блока catch? Не является ли блок finally достаточным для защиты данных?

Или могут ли эти поврежденные исключения состояния влиять только на catch и прекратить применение после этого?

+0

Без блока 'finally', если исключение не выбрано,' Protect() 'никогда не вызывается. (Если это не вызвано в конце блока 'try', но вы опустили строку.) – millimoose

+3

Правильно, но как насчет без' catch', в чем вопрос. –

+0

В случае исключения, я полагаю, что 'Protect' на самом деле называется дважды (catch и, наконец) - интересно, если это имеет какое-то значение. – Blorgbeard

ответ

0

Finally блоки почти всегда называются, за исключением нескольких случаев. См.

Does the C# "finally" block ALWAYS execute? для получения дополнительной информации.

Так что да, защита всегда называется в Finally.

+0

Итак, предложение catch не нужно? – ordag

1

Необходимо дублирование кода в блоке catch из-за нарушения безопасности в функции фильтрации исключений (не предоставляется C#, но Visual Basic и другие предлагают его). Он позволяет злоумышленнику выполнять свой код в блоке try-catch-finally, после того как исключение поймано и до того, как будет выполнен окончательный блок.

Угроза выглядит так: пользователь Visual Basic вашей библиотеки вызывает исключение после Unprotect() (даже OutOfMemoryException, закончив нехватку памяти), CLR не обнаруживает блокировки catch, тогда CLR выполняет код фильтра исключения пользователя, этот код крадет Unprotect (), и только тогда CLR выполняет Protect() в блоке finally.

Итак, поместите код очистки системы как в блокировки catch, так и в конце, обычная очистка остается только в конце.