Ответ 1
Нет, это совсем не безопасно. Type.GetType загрузит сборку, если она не была загружена до:
GetType вызывает загрузку сборки, указанной в typeName.
Так что же плохо с загрузкой сборки? Помимо этого, используя дополнительную память, как отмечает Дэниел, сборки .NET могут выполнять код при загрузке, хотя эта функциональность не распространяется на обычные компиляторы, такие как С# и VB.NET. Они называются инициализаторы модулей.
Метод инициализации модулей выполняется в или когда-либо раньше, первым доступом к любым типам, методам или данным, определенным в модуле
Просто тот факт, что вы загружаете сборку и проверяете ее типы, достаточно, чтобы запустить инициализатор модуля.
Кто-то, у которого есть умная письменная сборка (скажем, используя ilasm и записывая сырую MSIL), может выполнить код, просто загрузив сборку и исследуя типы. Вот почему мы Assembly.ReflectionOnlyLoad, чтобы мы могли безопасно загрузить сборку в неиспользуемой среде.
Я немного подумал об этом и подумал о нескольких случаях.
Учтите, что ваш пул приложений настроен на запуск 64-разрядной версии. Теперь представьте, что ваш злоумышленник использует службу AJAX, чтобы попытаться загрузить сборку, предназначенную исключительно для архитектуры x86. Например, в моем GAC есть один экземпляр Microsoft.SqlServer.Replication, который только x86, нет антикоммутатора AMD64. Если я попрошу вашу службу загрузить эту сборку, вы получите BadImageFormatException
. В зависимости от того, какие защитные предложения у вас есть при загрузке сборки, необработанные исключения могут полностью сбивать ваш AppPool.