5

有没有办法向人们公开 Razor 语法和(自定义)助手,但是说......不允许他们创建代码块,或者,只限制他们在助手的使用中并且不给他们执行纯的权力视图中的 C# 代码?

欢迎任何想法和类似解决方案的指针!

更新: //我想赋予用户编写自己的 HTML 并仅访问 html 助手列表的权力。主要是默认的和我创建的。

例如,我不希望他们能够在@{ //code }块内执行代码,也没有using@model(不确定这个)只能访问@Html.* @if else for foreach

或者更好的是,只允许他们访问特定的命名空间(这只是一个想法)

update:// 经过一些测试,我发现 RazorEngine 与我正在尝试做的事情一样接近:在隔离环境中运行视图并添加对特定命名空间的访问。

4

4 回答 4

4

我不建议你这样做。根本没有一种简单可靠的方法可以在不损害站点安全性的情况下赋予他们这种能力。如果您信任您的用户,那么您可以做到。如果您不这样做,那么模板引擎DotLiquid就更适合此目的。

于 2013-02-26T12:57:59.417 回答
2

您可以尝试更改 razor 视图引擎和相关类以检查不允许的情况。

生成源码时(查看引擎生成要编译的源文件),必须手动检查(通过解析c#或vb.net代码)。这是可能的,但不可行(真的)。

即使您设法解析和检查代码,您也必须识别您的代码(允许)和客户代码(有限制)。

最后,您必须接受这样一个事实,即除了使用另一个模板引擎之外,您不能真正禁止任何事情。

因为

  1. 您的客户会找到一种方法让他们的观点看起来像您的观点。
  2. 您不能限制最基本的必需功能,例如var r = new Random();
  3. 你无法估计最基本的要求是什么
  4. 当您的客户需要使用他们的自定义库时,您不能对他们说不

顺便说一句,你可以尝试另一件事。编写虚拟路径提供程序,并在AviatrixTemplate运行时请求时转换写入的客户模板。通过使用这条路线,您仍然使用剃须刀引擎,转换时仅松动一点时间(仅一次)。但是您AviatrixTemplate不会被突出显示,您仍然需要检查不允许的代码。

PS:一个基本的循环可能会给你的用户比你想要的更多。例如,下面的代码允许创建一个类并调用它一次。他们可以使用完全限定的类名,也可以使用Activator.CreateInstance.

@for (var r = new Random(); r != null; r = null)
{
    @r.NextDouble()
}

只是不要打扰。

于 2013-02-27T23:33:36.393 回答
2

有一个名为RazorEngine的项目,它建立在 Microsoft 的 Razor 之上,它允许您在不返回 MVC 视图的上下文中解析该语法。以下是它的使用方法:

 string template = "Hello @Model.Name! Welcome to Razor!";
 string result = Razor.Parse(template, new { Name = "World" });

您还可以指定自定义模板库,它应该允许您仅定义要向用户公开的 Html 助手:

 Razor.SetTemplateBase(typeof(HtmlTemplateBase<>));

 string template = 
  @"<html>
      <head>
        <title>Hello @Model.Name</title>
      </head>
      <body>
        Email: @Html.TextBoxFor(m => m.Email)
      </body>
    </html>";

  var model = new PageModel { Name = "World", Email = "someone@somewhere.com" };
  string result = Razor.Parse(template, model);
于 2013-02-28T03:25:33.240 回答
0

我以前从未这样做过,但听起来你想让用户能够编写代码并编译它以供使用,是吗?

如果是这样,您可能需要查看CSharpCodeProvider类、RazorTemplateEngine类和System.CodeCom.Compiler命名空间。

在这里查看有关这些类的一些信息:

CSharpCodeProvider: http: //support.microsoft.com/kb/304655

RazorTemplateEngine: http: //msdn.microsoft.com/en-us/library/system.web.razor.razortemplateengine (v=vs.111).aspx

于 2013-02-26T13:03:44.630 回答