让用户指定RazorEngine模板有多危险?

我有类似邮件合并的function,它采用模板,一些业务对象,并生成html,然后将其制作成PDF。

我正在使用RazorEngine来做模板+模型到html位。

如果我让用户指定模板, 我会冒哪些风险? 是否有可能减轻任何风险?

例如,用户可以执行任意代码吗? (删除文件,更改数据库等?)有什么方法可以检测到这种事情吗? (我知道这通常是不可能的,但是剃刀模板中的代码位应该是模型属性获取,或者可能是基于模型属性值的语句)。

我基本上相信这里的用户(这是一个小型的私人项目),但随着模板引擎的发展,这个应用程序似乎过于强大。

一个cshtml Razor文件能够执行任何。 网站上下文中的NET代码是的,允许用户提供它们是一种安全风险。

通过接受更通用的HTML模板,使用自定义标记输入模型数据,您将获得更好的服务。

在版本3中,我引入了一个IsolatedTemplateService ,它支持在另一个AppDomain解析/编译模板。 您将能够控制将编译模板的应用程序域的创建,这意味着您可以通过将安全策略应用于子应用程序域本身来引入您想要的任何安全要求。

在未来的推动中,我希望引入一种通用的方法来为管道添加扩展,因此您可以执行代码生成检查等操作。 我想这将启用在生成代码编译之前对类型进行类型检查的方案。

几天前我把早期版本的RazorEngine(v3)推到了GitHub上。 随意检查出来。 https://github.com/Antaris/RazorEngine

我相信删除using语句并使用正则表达式替换任何@System.[...]类似System.IO.File.Delete(filepath)可以减少相当多的可能的安全漏洞。

请记住,模板在上下文中运行,并且只能访问其中可用的内容,但也包括.NET Framework程序集。