2012-04-27 27 views
5

Pido disculpas de antemano por la naturaleza genérica de mi pregunta, pero no pude encontrar ningún consejo útil de personas que intentan hacer lo mismo que yo en la web. Permítanme describir mi escenario:ASP.NET MVC 3 Razor View Restrictions

Proporciono a los usuarios finales/diseñadores de un sitio web la posibilidad de personalizar sus vistas almacenando las vistas (usando Razor) en la base de datos. Tengo todo esto funcionando, pero mi pregunta es la siguiente; Desde el punto de vista de la seguridad, ¿cómo puedo garantizar y hacer cumplir que el código no deseado no se ejecuta en la vista definida por el usuario? Hay dos enfoques básicos que creo que funcionarán conceptualmente, pero no estoy seguro de cuál es más posible o factible.

Opción 1: Cree un método de validación en la herramienta de administración que permita al usuario ingresar el código de vista. Esto necesitaría tomar una lista blanca o una lista negra para lo que es permisible o no.

Opción 2: evitar que el código no deseado se pueda ejecutar cuando se produce el renderizado de la vista.

Como un ejemplo rápido de algo que tendría que bloquearse, no nos gustaría permitir el acceso a leer o escribir archivos, acceder a funciones de acceso a datos, ni siquiera acceder a la configuración, etc. en la web.config . Es probable que haya una lista decente de cosas que probablemente no deberían permitirse, pero tendré que sentarme y tratar de pensar en tantas preocupaciones relacionadas con la seguridad como sea posible.

Mi pregunta es, ¿qué método sería la mejor opción? Además, ¿se puede proporcionar alguna dirección sobre cómo proceder? Pensé que podría hacer un cambio basado en el nivel de confianza que sería la Opción 2, pero no pude encontrar ninguna forma de hacerlo funcionar en una casa solar basada en vista (el código de administración puede ejecutar lo que quiera). Estoy pensando que la Opción 1 terminará siendo la mejor y tendré que verificar la entrada de ciertas funciones de marco que no deberían permitirse. ¿Alguien tiene alguna experiencia haciendo algo como lo que estoy tratando de hacer? CUALQUIER comentario es muy apreciado!

+0

La opción 2 sería terrible desde la perspectiva de un usuario que puede tratar de usar un código que él o ella no sabía que era 'malo'. Estoy de acuerdo con SLaks en que un enfoque de lista blanca sería mejor, y no conozco la naturaleza exacta de su proyecto, como quiénes son sus consumidores, pero esta será una tarea difícil en función de la flexibilidad que necesite darles. – AwDogsGo2Heaven

+0

Iba a sugerirle que revisara el marcado líquido, luego encontré [DotLiquid] (http://dotliquidmarkup.org/try-online). Parece que cubre lo que intentas lograr (pero con Liquid en lugar de Razor). –

Respuesta

1

Esto sería extremadamente difícil.

Puede ejecutar la plantilla a través del preprocesador Razor, luego usar Roslyn (todavía en beta inicial) para analizar el archivo generado y buscar entre todas las llamadas a métodos (o constructores) y devolver un error si llama algo que no T como.
Recomiendo encarecidamente que utilice una lista blanca para eso, ya que el .Net Framework es lo suficientemente grande como para pasar por alto algo en una lista negra.


Sin embargo, yo en cambio recomendar que no utilice la maquinilla de afeitar en absoluto y en su lugar utiliza un motor de plantillas que no permite verdadero código C#.

+0

Originalmente empecé con un motor de plantillas personalizadas, pero parece que hay muchas ventajas de seguir con el motor de vista Razor. es decir, capacidad incorporada para tareas de programación de vista común como condicionales, bucles y el hecho de que proporciona acceso al modelo. Además, parece que el mecanismo de almacenamiento en caché integrado ahorrará muchos recursos en lugar de tener que implementar algo más personalizado para un sistema de plantillas personalizado. El único inconveniente real que puedo encontrar (aunque obviamente es un serio inconveniente) es la seguridad.Si puedes pensar en más inconvenientes, eso podría hacer que reconsidere. –