gpt4 book ai didi

c# - 用于用户模板的 RazorEngine - 安全性?

转载 作者:行者123 更新时间:2023-11-30 15:29:19 26 4
gpt4 key购买 nike

这是对 THIS 的更新问题是 V3 已经有一段时间了:

我也在考虑将 RazorEngine 用于邮件模板(甚至可能更多)。
现在是否有“足够的安全模式”可供用户定义模板?

使用 IsolatedTemplateService 我可以避免用户访问我的域对象,但是在旧问题中讨论的其他内容(如编辑/删除文件)呢?

还有什么是“手动”访问数据库(如果可以访问文件,则通过从配置文件中读取连接字符串,或者在最坏的情况下简单暴力破解),例如将用户添加为管理员?

有没有办法为 IsolatedTemplateService 创建的自定义 AppDomain“禁用”所有这些东西?

最佳答案

我能够通过不使用 RazorEngine 来解决这个问题,而是自己实现(基于那里的一些代码)。

RazorEngine 的主要问题如下:
对于编译 razor 模板所需的 CodeDomProvider,您需要一个“完全信任”AppDomain,但 IsolatedTemplateService 会执行新模板中的“所有内容” AppDomain 所以编译模板失败。

我把它分成两部分解决了这个问题:

  1. 编译模板
  2. 渲染模板

我在“主 AppDomain”中执行的第一步和“受限 AppDomain”中的第 2 步。

然后又出现了一个问题:
如果您“在内存中”编译模板(=> 不生成 *.dll 文件),这是由 RazorEngine 完成的,它会直接加载到当前 >AppDomain 我不想要它,因为它“继承”了域权限。
因此,我禁用了它并在“通用模板文件夹”中生成了一个 *.dll
所以在编译之后我有一个 *.dll 文件,其中包含尚未加载到任何地方的模板。

第二个 AppDomain 是使用以下权限集创建的:

PermissionSet permSet = new PermissionSet(PermissionState.None);
permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
permSet.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read, templatePath));
permSet.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess));

执行任何代码都需要第一个权限,第二个是允许 AppDomain 从我的通用模板文件夹加载生成的程序集,第三个是对反射的有限支持(仅在加载程序集,但不是即在 System.* 中)以支持 dynamic 因此我可以使用 ViewBag
其他一切都是被禁止的:

  • templatePath 之外没有文件访问权限>
  • 没有网络访问权限
  • 无 SQL Server 访问权限

然后,我在此受限域中调用 Render 方法,该方法加载适当的程序集并呈现模板。此方法还支持超时,之后渲染将被终止,以避免像 Kris 建议的那样 while (true) ; DOS 攻击。

到目前为止,这似乎工作正常。我现在确实将其发布为 IsolatedRazor包括 NuGet package .可能 RazorEngine 可以将其合并为例如RestrictedIsolatedTemplateService 左右...

关于c# - 用于用户模板的 RazorEngine - 安全性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23907325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com