He utilizado el siguiente código en una serie de aplicaciones para cargar ensamblajes .DLL que exponen plugins..NET Assembly Plugin Security
Sin embargo, antes siempre me preocupaba la funcionalidad, en lugar de la seguridad.
Ahora estoy planeando utilizar este método en una aplicación web que podría ser utilizada por otros grupos además de mí, y me gustaría asegurarme de que la seguridad de la función sea rápida.
private void LoadPlugins(string pluginsDirectory)
{
List<IPluginFactory> factories = new List<IPluginFactory>();
foreach (string path in Directory.GetFiles(pluginsDirectory, "*.dll"))
{
Assembly assembly = Assembly.LoadFile(path);
foreach (Type type in assembly.GetTypes())
{
IPluginEnumerator instance = null;
if (type.GetInterface("IPluginEnumerator") != null)
instance = (IPluginEnumerator)Activator.CreateInstance(type);
if (instance != null)
{
factories.AddRange(instance.EnumerateFactories());
}
}
}
// Here, I would usually collate the plugins into List<ISpecificPlugin>, etc.
}
Las pocas primeras preocupaciones que tienen:
- Esta función lee todo el directorio y no se preocupa por lo que las asambleas se carga, y en su lugar sólo se carga a todos ellos. ¿Hay alguna forma de detectar si un ensamblado es un ensamblado .NET funcional y válido antes de cargarlo con Assembly.LoadFile()?
- ¿Qué tipo de manejo de excepciones se debe agregar a la función para evitar que la inicialización del ensamblaje interrumpa mi código?
- Si deseo negarle a la asamblea el derecho de hacer lo siguiente: Leer/Escribir archivos, Leer/Wite el registro, etc., ¿cómo lo haría?
¿Hay alguna otra preocupación de seguridad que me preocupe?
EDITAR: Tenga en cuenta que quiero que alguien pueda escribir un complemento, pero igual quiero estar seguro.
La documentación de MSDN me confundió un poco con respecto a su respuesta. Por favor vea mi pregunta aquí http://stackoverflow.com/q/32016340/1462656. – erotavlas
Es un comentario interesante. Por lo que entiendo, un ensamblaje firmado indica 1) se ha firmado con una determinada clave y 2) no se pudo haber modificado después de la firma. Por lo tanto, técnicamente correcto, puede usar esto para verificar la identidad, pero no necesariamente la seguridad, o más bien la diferencia entre Authetication (el complemento está firmado y no alterado) frente a Authorization (el código está autorizado para realizar una determinada acción). –