2009-08-13 8 views
1

Je suis en train d'ajouter une interface à mon application pour que d'autres personnes puissent l'étendre avec des plugins. Mon application est utilisée par les joueurs MMO et je n'aurai aucun contrôle sur les plugins (en ce que tout le monde sera autorisé à les faire) et j'espérais pouvoir avoir un certain contrôle sur le code dans les plugins. Ce dont j'ai peur, c'est que quelqu'un fasse un plugin qui contient du mauvais code qui commence à écrire dans des dossiers en dehors des dossiers "autorisés" ou qui le fait par conception. Comme ce jeu sera géré par un joueur de MMO, une sorte de keylogger serait très mauvais. Donc, j'espère qu'il y a un moyen pour moi de: Forcer le plugin à s'exécuter dans un bac à sable où il n'a pas directement accès au système de fichiers, aux fenêtres ou au réseau. En les forçant à utiliser l'API, je fournis ces actions. Je pensais qu'il pourrait être possible d'inspecter le plugin dll en espérant qu'il contenait une liste des espaces de noms qu'il utilise, et simplement ne pas charger les plugins qui contenaient des espaces de noms "mauvais".Plugins à l'application (Puis-je contrôler l'espace de nom/code à l'intérieur des plugins)

Mon interface de plugin est basée sur this great codeproject artice, j'ai essayé de rechercher des informations à ce sujet. Mais je n'ai pas été capable d'affiner ma recherche à un point où elle a rendu quelque chose d'utile, si mon niveau de compétence est en C# et en C++.

+0

Je voudrais vérifier quelque chose comme le moteur Javascript embarquable V8 de Google. Cela nécessiterait que vous utilisiez au moins du C++, mais vous pourriez exposer les interfaces/objets que vous voulez au lieu d'avoir une approche barn-door-open que l'architecture de plugin que vous avez liée appelle. – overslacked

Répondre

2

Il serait possible d'inspecter l'ensemble pour certaines choses avant de le charger. Avant d'exécuter du code ou de créer un type dans l'assemblage, vous pouvez parcourir l'ensemble des types et des références d'assemblage à l'aide de la réflexion et rechercher des références "non valides". Cependant, cela ne va pas être très efficace, car vous êtes toujours à la recherche de choses qui sont mauvaises - quand vraiment, vous devez définir les opérations qui sont bonnes, et ne les autoriser que. La seule façon d'appliquer une politique de sécurité différente pour le plugin est de charger le plugin dans un autre AppDomain. En chargeant le plugin dans son propre AppDomain, vous pouvez appliquer différentes stratégies de sécurité sur son code (en l'exécutant dans un bac à sable). Vous pouvez fournir des interfaces ou des classes qui sont passées dans le plugin afin de lui donner accès à des fonctionnalités autres que celles du plugin lui-même.

Questions connexes