Помещайте уязвимые предложения finally во внешний блок try
Обновлен: Ноябрь 2007
TypeName |
WrapVulnerableFinallyClausesInOuterTry |
CheckId |
CA2124 |
Категория |
Microsoft.Security |
Критическое изменение |
Не критическое |
Причина
Открытый или защищенный метод содержит блок try/finally. Блок finally сбрасывает состояние безопасности не заключен в блок finally.
Описание правила
Это правило находит блоки try/finally, которые могут быть уязвимы для злонамеренных фильтров исключений в стеке вызова. Если в блоке try происходят важные операции, такие как олицетворение, и возникает исключения, то фильтр может быть выполнен до блока finally. В случае с олицетворением фильтр будет выполнен от имени олицетворенного пользователя. В настоящее время фильтры можно реализовать только в Visual Basic.
Устранение нарушений
Поместите распакованный блок try/finally во внешний блок try. См. второй пример ниже. При этом блок finally будет выполнен перед кодом фильтра.
Отключение предупреждений
Для этого правила отключать вывод предупреждений не следует.
Пример псевдокода
Описание
В следующем примере псевдокода показан шаблон, обнаруживаемый этим правилом.
Код
try {
// Do some work.
Impersonator imp = new Impersonator("John Doe");
imp.AddToCreditCardBalance(100);
}
finally {
// Reset security state.
imp.Revert();
}
Пример
В следующем примере псевдокода показан шаблон, который можно использовать для защиты кода и выполнения этого правила.
try {
try {
// Do some work.
}
finally {
// Reset security state.
}
}
catch()
{
throw;
}