2013-03-22 21 views
7

Ich verwende derzeit NInject, um Schnittstellen an konkrete Typen zu binden und diese in meine Klassen einzufügen. Ich gehe jedoch davon aus, dass dies eine Laufzeit-Angelegenheit ist. Für mich scheint es ein Angriffspunkt zu sein, wenn jemand das Verhalten meiner Anwendung ändern wollte.Kompilierzeit/Post-Build Dependency Injection IoC?

Gibt es irgendetwas, was es mir erlauben würde, meine Dependency-Injection-IoC zur Kompilierzeit zu migrieren (Lesen: Post-Build IL Weaving/Replacement)?


Um

In meinem Code ich ein Setup-Bindung

Bind<IFoo>().To<Foo>() 
Bind<Bar>().ToSelf().InSingletonScope(); 

mit Ctor Foo(Bar dependency)

An der Wurzel meiner Anwendung Elaborate (bei Inbetriebnahme) I Auflösen des Graphen

var foo = kernel.Get<IFoo>(); 

Angenommen ich keine Service-Locators (anti-pattern anyway right?) haben. Also habe ich keine Verwendung mehr für kernel.

Jetzt möchte ich eine "post-build release-compile" haben, die die Auflösungsengine des Kernels durch Instanciator oder Verweise auf constant/singleton usw. ersetzt. So, dass mein Code so aussieht;

var foo = kernel.Get<IFoo>(); 

In Wirklichkeit nach IL Ersatz in meinem letzten Build-Bühne, sieht es wie folgt aus:

var bar = new Bar(); 
var foo = new Foo(bar); 

Und es gibt keinen Hinweis auf ninject mehr.

Meine rationale für diese Frage ist, dass ich Fody IL Weave alle meine PropertyChanged Raiser verwenden und ich frage mich, ob es möglich wäre, etwas Ähnliches für Dependency Injection zu tun.

+0

Sind die Ninject-Abhängigkeitsregistrierungen in XML oder im Code? –

+0

Könnten Sie bitte genauer erklären, was die Kompilierzeit-Injektion ist? –

+0

Ich nehme an, dass Ihre Konfiguration für Ihre DI in Code über die Module erfolgt. So erhalten Sie bereits die Kompilierzeitsicherheit, auch wenn die DI-Verbindung zur Laufzeit stattfindet. Das geht jedoch in einer Tangente, wenn wir uns das Problem ansehen, das Sie vorschlagen ** Meine DI geschieht zur Laufzeit, aber ich möchte, dass sie zur Kompilierzeit stattfindet **, warum sollten Sie Dependency Injection überhaupt verwenden? ? Sie können auch die Module einfach entfernen und Instanzen oder Fabriken einfach manuell den Implementierungen zuweisen, so dass es keinen Runtime * Angriffspunkt * gibt. Für mich ist der halbe Grund, warum Sie DI verwenden, die Laufzeitkonfiguration – Grofit

Antwort

3

Wie bereits erwähnt, addieren sich Ihre angeführten Gründe dafür nicht. Philip Laureano (Linfu Autor) hat jedoch eine Hiro project einige Zeit zurück, die vor der Bereitstellung DI tut. Keine Ahnung, ob es irgendwohin ging ...

+0

Bei Betrachtung ist dies die einzige Antwort, die bisher die Frage beantwortet, und nicht meine ursprüngliche Vernunft, um sie zu stellen. IoC an sich ist ein Entwurfskonzept, unabhängig davon, ob die Anwendung des Inversionscontainers manuell, zur Kompilierungszeit oder zur Laufzeit ausgeführt wird. Also ändere ich die akzeptierte Antwort darauf. Ich würde trotzdem gerne einen fodyartigen IL Weaver sehen. : P –

+0

@MeirionHughes Ha, was hat dich so lange gedauert: D Ich sehe, dass ich die andere Antwort aufgewertet habe, da sie nützlich ist, egal, wie direkt sie antwortet. Der einzige logische nächste Schritt basierend auf Ihrem Kommentar ist natürlich, dass Sie eine [PR] (http://www.davepaquette.com/archive/2016/01/24/Submitting-Your-First-Pull-Request.aspx) machen) zu Fody, das Hiro als Basis nutzt: P –

+1

Nun, ich habe nach einem Grund gesucht, ein Fody Addon zu machen. : P –

8

Aus Sicht der Sicherheit im Allgemeinen die Verwendung eines DI-Container keine zusätzliche Gefahren für Ihre Anwendung nicht darstellen.

Wenn Sie eine Dienstanwendung (z. B. Webdienst oder Website) schreiben, kann der Angreifer nur das konfigurierte DI-Verhalten der Anwendung ändern, wenn diese Anwendung oder dieser Server bereits kompromittiert wurde. Wenn dies passiert, sollte der Server als verloren betrachtet werden (Sie müssen diesen Server neu formatieren oder wegwerfen). DI macht das nicht schlechter, da ein DI-Container typischerweise nicht erlaubt, das Verhalten von außen zu verändern. Sie müssen etwas sehr Seltsames tun, um dies zu erreichen.

Für eine Anwendung, die auf dem Computer des Benutzers ausgeführt wird, sollten Sie diese Anwendung jedoch immer als kompromittiert betrachten, da ein Angreifer Ihren Code dekompilieren, das Verhalten zur Laufzeit ändern kann. DI wiederum nicht Dies ist umso schlimmer, da Sie sich nur vor Angriffen auf die Dienstgrenze schützen können. Diese Client-App muss mit dem Server kommunizieren und der Speicherort für Ihre wertvollen Ressourcen liegt innerhalb der Dienstgrenzen. Zum Beispiel sollten Sie niemals ein Konto-Passwort in einer DLL auf dem Client speichern. Egal ob es verschlüsselt ist oder nicht.

Die Verwendung von DI kann es einem Angreifer jedoch leichter machen, das Verhalten einer Clientanwendung zu ändern, insbesondere wenn Sie alles in XML konfigurieren. Aber das gilt für alles, was Sie in der Konfigurationsdatei speichern. Und wenn das deine einzige Verteidigungslinie ist (entweder mit oder ohne DI), bist du sowieso verschraubt.

es scheint wie ein Angriffspunkt, wenn jemand kann das Verhalten meiner Anwendung

Bitte beachten Sie, dass jede Anwendung werden dekompilierten, verändert und neu kompiliert ändern wollte. Es spielt keine Rolle, ob es verwaltet (.NET, Java) oder nicht (C++), oder verschleiert oder nicht. Auch aus Sicherheitsgründen spielt es keine Rolle, ob Sie Laufzeit-DI oder Kompilierungszeit-DI ausführen. Wenn dies ein Problem ist, stellen Sie diesen Code nicht auf Computern bereit, für die Sie keine Kontrolle haben.