2012-04-27 4 views
5

Je m'excuse d'avance pour le caractère générique de ma question, mais je n'ai pas pu trouver de conseils utiles de personnes essayant de faire la même chose que moi sur le web. Permettez-moi de décrire mon scénario:ASP.NET MVC 3 Razor View Restrictions

Je fournis aux utilisateurs/concepteurs d'un site Web la possibilité de personnaliser leurs vues en stockant les vues (en utilisant Razor) dans la base de données. J'ai tout cela en marche, mais ma question est la suivante; Du point de vue de la sécurité, comment puis-je m'assurer que le code indésirable n'est pas exécuté dans la vue définie par l'utilisateur? Il y a deux approches fondamentales qui, je pense, fonctionneront conceptuellement, mais je ne suis pas sûr de savoir lequel est le plus possible ou faisable.

Option 1: Créez une méthode de validation dans l'outil d'administration qui permet à l'utilisateur d'entrer le code de vue. Cela devrait soit prendre une liste blanche ou une liste noire de ce qui est permis ou non.

Option 2: Empêche le code indésirable d'être exécuté lors du rendu de la vue. Comme exemple rapide de quelque chose qui devrait être bloqué, nous ne voulons pas autoriser l'accès à la lecture ou à l'écriture de fichiers, accéder à des fonctions d'accès aux données ou même accéder aux paramètres de configuration, etc. dans web.config . Il y aura probablement une liste décente de choses qui ne devraient probablement pas être permises, mais je vais devoir m'asseoir et essayer de penser à autant de préoccupations liées à la sécurité que possible.

Ma question est alors, quelle méthode serait le meilleur pari? En outre, peut-on donner des directives sur la façon de s'y prendre? J'ai pensé que je pourrais être capable de faire des changements basés sur la confiance, ce qui serait l'option 2, mais je ne trouverais aucun moyen de faire cela dans un manoir basé sur la vue (le code d'administration est autorisé à exécuter tout ce qu'il veut). Je pense que l'option 1 finira par être le meilleur pari et je devrai vérifier l'entrée de certaines fonctions du framework qui ne devraient pas être autorisées. Est-ce que quelqu'un a de l'expérience à faire quelque chose comme ce que j'essaie de faire? TOUT commentaire est très apprécié!

+0

L'option 2 serait terrible du point de vue d'un utilisateur qui pourrait essayer d'utiliser un code qu'il ou elle ne savait pas être «mauvais». Je suis d'accord avec SLaks une approche de liste blanche serait mieux, et je ne connais pas la nature exacte de votre projet, comme qui sont vos consommateurs, mais ce sera une tâche difficile en fonction de la flexibilité dont vous avez besoin de leur donner. – AwDogsGo2Heaven

+0

J'allais vous suggérer de vérifier le balisage liquide, puis j'ai trouvé [DotLiquid] (http://dotliquidmarkup.org/try-online). Il semble que cela couvre ce que vous essayez d'accomplir (mais avec Liquid au lieu de Razor). –

Répondre

1

Cela serait extrêmement difficile. Vous pouvez exécuter le modèle via le préprocesseur Razor, puis utiliser Roslyn (toujours en début de version bêta) pour analyser le fichier généré et parcourir tous les appels de méthode (ou constructeurs) et renvoyer une erreur s'il appelle quelque chose que vous ne faites pas. J'aime.
Je vous recommande fortement d'utiliser une liste blanche pour cela, étant donné que le framework .Net est assez grand pour que vous soyez obligé d'ignorer quelque chose dans une liste noire.


Cependant, je recommande plutôt que de ne pas utiliser de rasoir du tout et d'utiliser à la place d'un moteur de templating qui ne permet pas de code réel C#.

+0

À l'origine, je commençais avec un moteur de template personnalisé, mais il semble y avoir de nombreux avantages à coller avec le moteur de vue Razor. c'est-à-dire une capacité intégrée pour des tâches de programmation de vues communes telles que des conditions, des boucles, et le fait qu'il donne accès au modèle. De plus, il semble que le mécanisme de mise en cache intégré économise beaucoup de ressources au lieu de devoir implémenter quelque chose de plus personnalisé pour un système de gabarit personnalisé. Le seul vrai inconvénient que je peux trouver (bien que ce soit évidemment un sérieux inconvénient) est la sécurité.Si vous pouvez penser à plus d'inconvénients, cela pourrait me faire reconsidérer. –