C# ASP.NET MVC 3 Razor视图限制

C# ASP.NET MVC 3 Razor视图限制,c#,asp.net,.net,asp.net-mvc-3,C#,Asp.net,.net,Asp.net Mvc 3,我为我的问题的一般性提前道歉,但我无法从那些试图在网上做与我相同事情的人那里找到任何有用的建议。让我描述一下我的情景: 我为网站的最终用户/设计师提供了通过在数据库中存储视图(使用Razor)来定制其视图的能力。我有所有这些工作,但我的问题是:;从安全的角度来看,我如何确保和强制不需要的代码不会在用户定义的视图中执行?我认为有两种基本方法在概念上可行,但不确定哪一种更可行 选项1:在管理工具中创建一个验证方法,允许用户输入视图代码。这需要采取白名单或黑名单的方法来确定哪些是允许的,哪些是不允许的

我为我的问题的一般性提前道歉,但我无法从那些试图在网上做与我相同事情的人那里找到任何有用的建议。让我描述一下我的情景:

我为网站的最终用户/设计师提供了通过在数据库中存储视图(使用Razor)来定制其视图的能力。我有所有这些工作,但我的问题是:;从安全的角度来看,我如何确保和强制不需要的代码不会在用户定义的视图中执行?我认为有两种基本方法在概念上可行,但不确定哪一种更可行

选项1:在管理工具中创建一个验证方法,允许用户输入视图代码。这需要采取白名单或黑名单的方法来确定哪些是允许的,哪些是不允许的

选项2:防止在呈现视图时执行不需要的代码

作为一个需要阻止的示例,我们不希望允许访问web.config中的读或写文件、访问任何数据访问功能,甚至访问配置设置等。可能会有一个大小适中的清单,列出一些可能不允许的事情,但我需要坐下来,尽可能多地考虑与安全相关的问题


那么我的问题是,哪种方法是最好的选择?此外,能否就如何开展这两项工作提供指导?我认为我可能能够进行基于信任级别的更改,这将是选项2,但找不到任何方法在基于每个视图的庄园中实现这一点(允许管理代码执行它想要的任何操作)。我认为选项1最终将是最好的选择,我必须检查某些框架函数的输入,这是不允许的。有没有人有过做我想做的事情的经验?非常感谢您的反馈

这将非常困难

您可以通过Razor预处理器运行模板,然后使用Roslyn(仍处于早期测试版)解析生成的文件,查看所有方法调用(或构造函数),如果它调用了您不喜欢的内容,则返回错误。
我强烈建议您为此使用白名单,因为.Net framework足够大,您肯定会忽略黑名单中的某些内容



但是,我建议您不要使用Razor,而是使用一个不允许真正的C代码的模板引擎。

从用户的角度来看,选项2会很糟糕,用户可能会尝试使用他或她不知道是“坏”的代码。我同意SLaks,白名单方法会更好,我不知道你的项目的确切性质,比如谁是你的消费者,但这将是一个困难的任务,取决于你需要给他们多大的灵活性。我打算建议你检查一下液体加价,然后我发现。它似乎涵盖了您试图实现的目标(但使用的是液体而不是剃须刀)。我最初使用的是自定义模板引擎,但坚持使用剃须刀视图引擎似乎有很多好处。i、 e.内置通用视图编程任务的能力,如条件、循环,以及它提供对模型的访问。另外,似乎内置的缓存机制将节省大量资源,而无需为自定义模板系统实现更多自定义功能。我能找到的唯一真正的缺点(尽管这显然是一个严重的缺点)是安全性。如果你能想出更多的缺点,那可能会让我重新考虑。