2015-05-29 51 views
1

我制作了一个多用户博客引擎,该引擎使用了很棒的ASP.NET Razor模板引擎。用户可编辑的ASP.NET Razor模板 - 出于安全原因删除@

用户可以编辑自己的页面模板和自定义标签撰写他们喜欢{{BLOG_POST_NAME}}{{BLOG_POST_COMMENTS_LIST}}

那么那些{{...}}使用正则表达式与适当的剃刀代码替换标签。

Razor语法的所有用法都在那些{{...}}用户不可编辑的自定义标签内完成。

因此,基本上用户可以编辑他们所组成的自定义{{...}}标签旁边的所有博客文章模板。

限制用户定义模板中Razor语法的好方法是什么?

我不希望用户在博客文章的模板内部做一些@(ViewModel.Db.DropAllTables()),但我必须有权访问@(something...)内部的标签,这些标签不能被用户编辑。

至于现在,就在用户保存模板之前,我从用户编辑的模板中删除所有@,然后用他们的Razor内容替换标签。

但用户可以做@ViewModel.Something,它仍然呼吁剃刀逻辑...

我想从用户模板移除所有@符号,以防止它,但它不会让用户做CSS @媒体 - 在他们的模板中查询并使用[email protected]

最后一件事我做 - 改变的正则表达式查找符号从用户模板上删除对(@+\B)|(\[email protected]+\b)

该正则表达式查找@从去除: “@abc '@' @abc BCD @ ABC @ (对于)

,但仍保留了: ABC @ ABC

也许我忘了剃须刀的一些其他可能的用法@

为了让用户定义的模板受到保护并允许在标记内容中仅使用Razor语法,您可以采取什么建议?

更新:使用RazorEngine。

回答

1

你使用Asp.Net或RazorEngine吗?您将两个标签应用于您的问题,所以我假设您正在使用RazorEngine并回答以下问题:

我建议允许所有事情,并通过代码访问安全性和一个孤立的AppDomain应用运行时限制(这仍然有一些缺点:像用户可以占用资源,解决这个问题需要进程级别的隔离)。您可以使用RazorEngine隔离API进行以下操作:https://antaris.github.io/RazorEngine/Isolation.html

对于Asp.Net,您基本上可以做同样的事情,但是您自己负责,并且需要自己处理跨域通信。

matthid - 一个RazorEngine贡献者

+0

是的,这是RazorEngine。 AppDomain将防止访问文件系统。我想没有任何访问数据库的保护措施,比如获取一个存储连接字符串的参数,并将其与精简器一起使用,以获取系统中所有用户的MD5散列值。这就是为什么我想以某种方式限制或逃避'@'符号。至于现在,我只是在博客用户提交模板后删除'@'。 – Zelid

+0

不完全,您可以添加自己的权限,制作包装类,并根据需要保护资源。例如,您只需通过使属性SecurityCritical可以限制对“ViewModel.Db”的访问。该模板将无法访问它。 – matthid