2012-04-27 25 views
5

Ich entschuldige mich im Voraus für die generische Art meiner Frage, aber ich konnte keine hilfreichen Ratschläge von Menschen finden, die versuchen, das gleiche wie ich im Internet zu tun. Lassen Sie mich mein Szenario beschreiben:ASP.NET MVC 3 Razor Einschränkungen anzeigen

Ich biete Endbenutzern/Designern einer Website die Möglichkeit, ihre Ansichten durch Speichern der Ansichten (mit Razor) in der Datenbank anzupassen. Ich habe alles funktioniert, aber meine Frage ist die folgende; Wie kann ich aus Sicherheitsgründen sicherstellen und erzwingen, dass unerwünschter Code nicht in der benutzerdefinierten Ansicht ausgeführt wird? Es gibt zwei grundlegende Ansätze, von denen ich denke, dass sie konzeptionell funktionieren werden, aber ich bin mir nicht sicher, welche davon möglich oder machbar ist.

Option 1: Erstellen Sie eine Validierungsmethode im Administrationstool, mit der der Benutzer den Ansichtscode eingeben kann. Dies müsste entweder eine Whitelist- oder eine Blacklist-Herangehensweise an das zulassen, was zulässig ist oder nicht.

Option 2: Verhindern, dass unerwünschter Code beim Rendern der Ansicht ausgeführt werden kann.

Als schnelles Beispiel für etwas, das blockiert werden müsste, würden wir keinen Zugriff auf das Lesen oder Schreiben von Dateien, Zugriff auf Datenzugriffsfunktionen oder sogar den Zugriff auf Konfigurationseinstellungen usw. in der Datei web.config erlauben . Es wird wahrscheinlich eine anständige Größe von Dingen geben, die wahrscheinlich nicht zulässig sein sollten, aber ich muss mich hinsetzen und versuchen, so viele sicherheitsrelevante Bedenken wie möglich zu berücksichtigen.

Meine Frage ist dann, welche Methode wäre die beste Wette? Kann man auch eine Richtung angeben, wie man vorgeht? Ich dachte, ich könnte vielleicht Änderungen auf der Vertrauensstufe vornehmen, was Option 2 wäre, aber ich konnte keine Möglichkeit finden, diese Arbeit auf einer per View basierenden Basis zu erledigen (der Administrationscode darf ausführen, was er will). Ich denke, Option 1 wird am Ende die beste Wette sein, und ich werde auf die Eingabe bestimmter Rahmenfunktionen achten müssen, die nicht erlaubt sein sollten. Hat irgendjemand irgendeine Erfahrung, irgendetwas zu tun, was ich versuche zu tun? Jegliches Feedback wird sehr geschätzt!

+0

Option 2 wäre aus der Sicht eines Benutzers schrecklich, der versuchen könnte, Code zu verwenden, von dem er sonst nicht wusste, dass er "schlecht" ist. Ich stimme SLaks zu, dass ein White-List-Ansatz besser wäre, und ich kenne die genaue Art Ihres Projekts nicht, z. B. wer Ihre Kunden sind, aber dies wird eine schwierige Aufgabe sein, abhängig davon, wie viel Flexibilität Sie benötigen. – AwDogsGo2Heaven

+0

Ich wollte vorschlagen, dass Sie Liquid Markup auschecken, dann fand ich [DotLiquid] (http://dotliquidmarkup.org/try-online). Es sieht so aus, als ob es deckt, was du erreichen willst (aber mit Liquid statt Razor). –

Antwort

1

Dies wäre extrem schwierig.

Sie können die Vorlage über den Razor-Präprozessor ausführen und anschließend Roslyn (noch in der frühen Betaversion) verwenden, um die generierte Datei zu analysieren und alle Methodenaufrufe (oder Konstruktoren) durchzugehen und einen Fehler zurückzugeben t wie.
Ich empfehle dringend, dass Sie eine Whitelist dafür verwenden, da das .Net-Framework groß genug ist, dass Sie etwas in einer Blacklist übersehen müssen.


Allerdings würde ich stattdessen empfehlen, dass Sie nicht Razor überhaupt zu verwenden und stattdessen einen Template-Engine verwenden, die nicht real C# -Code nicht gestattet.

+0

Ich habe ursprünglich mit einer benutzerdefinierten Templating-Engine begonnen, aber es scheint viele Vorteile zu geben, mit der Razor-View-Engine zu bleiben. d. h. eingebaute Fähigkeit für allgemeine Ansichtsprogrammieraufgaben, wie Konditionalsignale, Schleifen und die Tatsache, dass sie Zugriff auf das Modell bereitstellt. Außerdem scheint es so, als würde der eingebaute Caching-Mechanismus eine Menge Ressourcen einsparen, anstatt dass ich etwas mehr Customization für ein benutzerdefiniertes Template-System implementieren müsste. Der einzige wirkliche Nachteil, den ich finden kann (obwohl es offensichtlich ein ernsthafter Nachteil ist), ist die Sicherheit.Wenn Sie an mehr Nachteile denken können, könnte mich das überdenken. –