- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是对 THIS 的更新问题是 V3 已经有一段时间了:
我也在考虑将 RazorEngine
用于邮件模板(甚至可能更多)。
现在是否有“足够的安全模式”可供用户定义模板?
使用 IsolatedTemplateService
我可以避免用户访问我的域对象,但是在旧问题中讨论的其他内容(如编辑/删除文件)呢?
还有什么是“手动”访问数据库(如果可以访问文件,则通过从配置文件中读取连接字符串,或者在最坏的情况下简单暴力破解),例如将用户添加为管理员?
有没有办法为 IsolatedTemplateService
创建的自定义 AppDomain
“禁用”所有这些东西?
最佳答案
我能够通过不使用 RazorEngine
来解决这个问题,而是自己实现(基于那里的一些代码)。
RazorEngine
的主要问题如下:
对于编译 razor 模板所需的 CodeDomProvider
,您需要一个“完全信任”AppDomain
,但 IsolatedTemplateService
会执行新模板中的“所有内容” AppDomain
所以编译模板失败。
我把它分成两部分解决了这个问题:
我在“主 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
之外没有文件访问权限>然后,我在此受限域中调用 Render
方法,该方法加载适当的程序集并呈现模板。此方法还支持超时,之后渲染将被终止,以避免像 Kris 建议的那样 while (true) ;
DOS 攻击。
到目前为止,这似乎工作正常。我现在确实将其发布为 IsolatedRazor
包括 NuGet package .可能 RazorEngine
可以将其合并为例如RestrictedIsolatedTemplateService
左右...
关于c# - 用于用户模板的 RazorEngine - 安全性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23907325/
我的 RazorEngine 版本 3.6.3 有问题RazorEngine 无法从“字符串”转换为“RazorEngine.Templated.ITemplateKey” 我的代码如下:
我有一个控制台应用程序,它使用 RazorEngine 根据应用程序的运行发送电子邮件。我成功地能够在开发 IDE 中和通过可执行文件运行控制台应用程序发送电子邮件。但是,当我从计划任务运行控制台应用
当您调用 RazorEngine.Razor.Compile() ,编译后的模板存放在哪里? 程序重新启动后是否可用?如果内存不足,会被转储吗? 我正在使用 RazorEngine在 ASP.NET
我正在使用RazorEngine渲染一些基本内容(一个非常粗糙的内容管理系统)。 除非我在标记中包含任何@Html语法,否则它的效果很好。 如果标记包含@html,则会出现以下错误: Unable t
在我的页面中,我想显示这样的字符串: Today is (x)th of july 其中 (x) 由程序在运行时计算并作为@Model.Number 传递给 RazorEngine 但是下面的模板格式
目前,我正在使用 RazorEngine v2.1 作为发送模板化电子邮件(数千封)的后台进程的一部分。为了加快速度,模板以其 md5 和作为名称进行编译。这样一来,当模板更改时,它会被重新编译,并且
我正在尝试用这一行编译一个 razor 文件 RazorEngine.Razor.Parse("Hello world"); 但它只是抛出 base {System.Exception} = {"Un
我像这样使用 Razor 引擎: public class EmailService : IService { private readonly ITemplateService templa
我正在使用 Razor 引擎 https://github.com/Antaris/RazorEngine解析我的电子邮件模板的正文。是否可以定义布局并包含其他 .cshtml 文件?例如常见的页眉和
string templ = @"@Model.Name[0] @Model.Name[1]"; string result = RazorEngine.Razor.Parse(templ, new
我们有一个使用 RazorEngine 解析电子邮件内容并使用 Web API 客户端发送电子邮件的类库。 我们使用它通过控制台应用程序定期发送时事通讯。这非常有效,因为它每天可以发送 50k+ 封电
我正在使用 RazorEngine 构建一个电子邮件模板系统,并希望在与我的主模板不同的 cshtml 文件中维护辅助函数。例如,假设我有一个这样的文件夹结构: /Templates Supp
这是对 THIS 的更新问题是 V3 已经有一段时间了: 我也在考虑将 RazorEngine 用于邮件模板(甚至可能更多)。 现在是否有“足够的安全模式”可供用户定义模板? 使用 IsolatedT
当 razor 模板有一个包含在括号中的变量时(例如下面代码中的“(@Model.B)”),如果该变量前面有“ 标志来查找将用作 html 的标签。 要解决您的问题,您可以使用 < 的 xml 替换
我正在使用 Razor 引擎:https://github.com/Antaris/RazorEngine . 我正在动态创建模型。我试图在模板中包含一个扩展方法,但它会识别扩展类。我收到以下错误消息
我正在尝试使用 RazorEngine 将其他文件包含在模板中,但我有点卡住了。我掌握了基础知识,但我希望能够在我的模板中使用 @Include("somefile.html")。 这是我到现在为止得
我一直在尝试在我的一个小项目中使用 RazorEngine,但是当我尝试使用模板布局时无法克服这个错误。 Unable to compile template. 'object' does not c
是否可以知道特定模板是否已使用 RazorEngine 编译?基本上,如果您调用: Razor.Parse("Hello there @Model.Name", model, "hello-world
我注意到 RazorEngine.Compile() 似乎以不同于其他类型的方式对待匿名类型。例如,考虑以下代码: public static void Main() { try {
我有类似邮件合并的功能,它采用模板、一些业务对象,并生成 html,然后将其制作成 PDF。 我正在使用 RazorEngine将模板+模型做成 html 位。 如果我让用户指定模板,我要冒什么风险?
我是一名优秀的程序员,十分优秀!