6

我有类似邮件合并的功能,它需要一个模板、一些业务对象,然后生成 html,然后将其制成 PDF。

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

如果我让用户指定模板,我会承担什么风险?是否有可能减轻任何风险?

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

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

4

3 回答 3

11

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

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

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

于 2011-10-14T13:17:37.073 回答
5

一个 cshtml Razor 文件可以执行任何。NET 代码,所以是的,允许用户提供它们是一种安全风险。

接受更通用的 HTML 模板会更好地为您服务,并使用自定义标记来输入模型数据。

于 2011-10-14T12:10:29.323 回答
1

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

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

于 2011-10-14T12:09:30.370 回答