2011-10-14 11 views
7

Tengo funcionalidad de fusión de correspondencia, que toma una plantilla, un objeto comercial y produce html que luego se convierte en PDF.¿Qué tan peligroso es permitir que los usuarios especifiquen las plantillas de RazorEngine?

Estoy usando RazorEngine para hacer la plantilla + modelo a bit html.

Si dejo que los usuarios especifiquen las plantillas, ¿qué riesgos estoy tomando? ¿Es posible mitigar cualquier riesgo?

Por ejemplo, ¿podrían los usuarios ejecutar código arbitrario? (eliminar archivos, alterar la base de datos, etc.?) ¿Hay alguna forma en que pueda detectar este tipo de cosas? (Sé que sería imposible en general, pero los bits de código en la plantilla de la máquina de afeitar deberían ser propiedades de la propiedad del modelo, o posiblemente si las declaraciones se basan en los valores de las propiedades del modelo).

Básicamente confío en los usuarios aquí (es un pequeño proyecto privado), pero como los motores de plantillas van, este parece excesivamente poderoso para esta aplicación.

Respuesta

6

Un archivo cztml Razor puede ejecutar cualquiera. Código NET en el contexto del sitio, así que sí, es un riesgo de seguridad permitir que los usuarios lo suministren.

Sería mejor que aceptara una plantilla HTML más general, con tokens personalizados para ingresar datos del modelo.

+0

Gracias. Estoy buscando en otro lugar un motor de plantillas ahora.Sintió que Razor era inseguro en esta aplicación, pero no encontré a nadie haciendo esta advertencia (y hay muchos artículos sobre cómo usarlo para combinar correspondencia). – Greg

1

creo que haber retirado using declaraciones y la sustitución de cualquier @System.[...] como System.IO.File.Delete(filepath) utilizando expresiones regulares puede reducir una buena cantidad de posibles agujeros de seguridad.

Tenga en cuenta que la Plantilla se ejecuta dentro de un contexto y puede acceder solo a lo que está disponible en ella, pero eso también incluye los ensamblados de .NET Framework.

+0

@ {using System.IO;} Sin intentarlo, sospecho que el código funciona bien y estoy seguro de que habrá otras formas inteligentes de vencer casi cualquier expresión regular. No es seguro y es mejor construir algo simple y seguro desde el principio. Diría –

+0

. Es cierto. Pero la única forma en que alguien puede usar las bibliotecas .NET es escribir usando System. [...] o usando NS = System. [...] o escribir el espacio de nombres completo. (No puedo pensar de otra manera por ahora). Sin embargo, estoy de acuerdo en que es peligroso, pero todo viene con una compensación y si alguien debe usar RazorTemplates, creo que cuidar .NET Lib es un buen comienzo. – djsolid

+0

Estoy seguro de que podrías hacer algunas cosas funky con reflexión, si estuvieras tratando * realmente * de vencer a las expresiones regulares ... ... aunque tendrías que llamar * algo * directamente en algún momento, supongo. – Greg

11

En la versión 3 introduje un IsolatedTemplateService que admite el análisis/compilación de plantillas en otro AppDomain. Podrá controlar la creación del dominio de aplicación en el que se compilarán las plantillas, lo que significa que puede introducir los requisitos de seguridad que desee aplicando políticas de seguridad al propio dominio de aplicación hijo.

En futuros empujones, espero introducir una forma genérica para agregar extensiones a la canalización, para que pueda hacer cosas como la inspección de generación de código. Me imagino que esto habilitará escenarios para la verificación de tipos del código generado antes de que se compile.

Empujé una versión anterior de RazorEngine (v3) en GitHub hace unos días. Siéntete libre de echarle un vistazo. https://github.com/Antaris/RazorEngine

+0

Gracias, estaré pendiente de RazorEngine: parece realmente útil (pero no para esta aplicación, en este momento). – Greg

Cuestiones relacionadas