ASP.NET MVC 3 Razor 视图限制

5
我提前为我的问题的普遍性道歉,但是我无法在网络上找到任何有用的建议来帮助那些与我一样想要做同样事情的人。让我描述一下我的情况:
我为网站的最终用户/设计师提供了定制视图的功能,通过将这些视图(使用 Razor)存储在数据库中。我已经完成了所有工作,但是我的问题是:从安全角度来看,如何确保和执行不希望的代码不会在用户定义的视图中运行?我认为有两种基本方法可以在概念上起作用,但不确定哪种更可行。
选项1:在管理工具中创建验证方法,允许用户输入视图代码。这需要采取白名单或黑名单方法来限制什么是允许的或不允许的。
选项2:在呈现视图时防止不希望的代码能够执行。
例如,我们不希望允许访问读取或写入文件,在web.config中访问任何数据访问函数,甚至访问配置设置等。可能会有一个相当大的列表,列出了可能不应该被允许的许多与安全相关的问题。
我的问题是,哪种方法是最好的选择?还可以提供关于如何进行任何方向吗?我曾经认为我可以基于信任级别的更改,这将是选项2,但无法找到任何在每个视图基础上让它工作的方法(管理代码允许执行任何操作)。我认为选项1最终会成为最佳选择,我需要检查不应被允许的某些框架函数的输入。是否有任何人对我正在尝试做的事情有任何经验?非常感谢您的任何反馈!

从用户的角度来看,选项2可能是可怕的,因为用户可能会尝试使用他/她本来不知道是“坏”的代码。我同意SLaks的白名单方法更好,但我不知道您的项目的确切性质,例如谁是您的消费者,但这将取决于您需要给他们多少灵活性,这将是一个困难的任务。 - AwDogsGo2Heaven
我原本打算建议你去了解Liquid标记语言,然后我发现了DotLiquid。看起来它可以实现你想要的功能(但是使用的是Liquid而不是Razor)。 - Joseph Yaduvanshi
1个回答

1

这将非常困难。

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


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


我最初确实使用了自定义模板引擎,但坚持使用Razor视图引擎似乎有许多优点。例如,它内置了常见视图编程任务的能力,如条件语句、循环以及提供对模型的访问权限。此外,它似乎内置的缓存机制将节省大量资源,而不是我必须为自定义模板系统实现更多自定义内容。我唯一真正发现的缺点(尽管这显然是一个严重的缺点)是安全性。如果您能想到更多缺点,那可能会让我重新考虑。 - Matt Segedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接