Предоставляет ли ресурс «мм» сборщик мусора?
Как только он мертв, да. В конце концов GC запустится и освободит память, если она не найдена.
Это риск для безопасности?
Давайте будем точными в нашей терминологии. Объект - это что-то ценное: личные данные, время пользователя и т. Д. Атакующий - это тот, кто хочет причинить вред активу. A Угроза - это способ, которым злоумышленник может нанести вред. A уязвимость - это аспект сценария, который может быть использован злоумышленником для обеспечения угрозы.
Чтобы ответить на ваш вопрос, мы должны знать:
- Что такое актив?
- Кто такой злоумышленник?
- Какова угроза, которую атакующий представляет для этого актива?
- Какая уязвимость может использовать злоумышленник, чтобы уловить угрозу?
Только после того, как вы сообщите ответы на эти вопросы, возможно, мы узнаем, является ли отказ немедленно освободить буфер памяти при исключении - это риск для безопасности.
Для реального примера, актив может быть моим телевизором, злоумышленник может быть вором, угроза - это кража, а уязвимость - это разблокированное окно второго этажа и лестница в моем гараже. Лестница и окно являются частью уязвимости к этой угрозе. Однако ни одна из них не является уязвимостью к угрозе, скажем, поджога. Вы не можете определить риск конкретного аспекта ситуации, пока не узнаете, какова реальная угроза!
Я знаю, что лучше всего явно выделять выделенный ресурс.
Это хорошая практика, чтобы явно очистить неуправляемых ресурсы, как дескрипторы файлов, которые управляются операционной системой. Как правило, вы позволяете сборщику мусора очищать управляемую память.
Может быть, я ошибаюсь, но я не совсем согласен с последним абзацем. Помимо 'Dispose()' 'MemoryStream' не делает много (без неуправляемых ресурсов), так как нет ссылки на' MemoryStream', нет никакой разницы между исключением или нормальным выходом и DoS на таком метод просто вызовет GC более чем необходимо. Я думаю, что если у вас есть уязвимость DoS, это не ваша самая большая проблема. Вы согласны или у вас другое мнение? –
@Pieter: Я извиняюсь, что, возможно, я не понимаю, что вы говорите, но я попытаюсь ответить: я согласен, что вы должны «Dispose» из 'MemoryStream'; он «сбрасывает» буфер и закрывает поток, предотвращая дальнейшую запись (при условии, что он используется для записи). Но я думаю, что первоначальный искатель использовал только «MemoryStream» в качестве примера для любой выделенной памяти; он мог бы просто быть «новым Foo» и имел бы в виду то же самое для его вопроса. – Randolpho
@Pieter (продолжение): Как вы говорите, нет разницы между исключением и нормальным выходом, кроме потока программы, и я согласен, что если есть уязвимость DoS, она, скорее всего, будет находиться где-то в другом месте. Я думаю, что в большинстве случаев выделение памяти во время вызова метода (с помощью 'new Anything()') не является уязвимостью DoS, если только ваш метод не особенно плох в распределении много временной памяти. Даже тогда это меньше «DoS-уязвимости» и более «неаккуратного программирования». – Randolpho