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

时间:2011-10-14 11:34:14

标签: c# .net asp.net razor mailmerge

我有类似邮件的功能,它接受一个模板,一些业务对象,并生成html,然后将其制作成PDF格式。

我正在使用RazorEngine将模板+模型设为html位。

如果我让用户指定模板,我冒什么风险?是否有可能减轻风险?

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

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

3 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

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

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