允许在ASP.NET站点中使用用户创建的模板

时间:2012-09-14 18:47:47

标签: asp.net templates user-input

我有一个网站,我正在从经典ASP转换为ASP.NET。旧网站允许用户编辑网站模板,为网站的各个部分创建自己的设计(想想MySpace,只有LESS专业人士。)

我一直绞尽脑汁试图弄清楚如何用.NET做到这一点。我的网站通常使用母版页,但显然这对最终用户不起作用。

我已经尝试将HTML模板作为常规文本文件加载并解析它以“适应”内容占位符。它听起来很难看。

这里有一种通常被认为是最佳做法的东西,但我肯定找不到它。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您希望用户拥有多少控制权?

有几种方法可以实现这一点。我将简要总结一下我能想到的所有想法:

具有预定义字段的静态HTML。

通过这种方法,您可以完全控制并最大限度地降低任何安全漏洞的风险。您可以将每用户HTML存储在某个数据库表中。此HTML将具有带有一些标记的预定义字段,例如使用{fieldName}。然后,您将使用一个简单的解析器来标识大括号,并将fieldName替换为从某处Dictionary<String,String>拉出的字符串值。

如果您对字符串处理很聪明(即使用状态机解析器查找curley括号,将重建的字符串直接发送到输出或发送到StringBuilder等),这种方法可以很快,重要的是使用String.Replace)。缺点是它不是一个真正的模板系统:没有提供循环结果集(假设你想允许),表达式评估,但它适用于简单的“将此内容插入此空间”类型的设计。

允许用户编辑自己的ASPX或ASCX文件。

如果可以使用ASP.NET,为什么要构建自己的模板系统?嗯,如果你想构建一个快速的'n'脏报告系统,这种方法是最简单的,但它在安全性方面非常失败。遗憾的是,由于ASP.NET的工作原理,您无法保护沙箱中ASPX文件中的任何<% %> / <script runat="server">代码或使用CAS(我之前自己研究过这个问题:Code Access Security on a per-view ASP.NET MVC basis)。

您不需要将实际的ASPX和ASCX文件存储在网站的文件系统中,您可以使用VirtualPathProvider实现将文件存储在数据库中,但是使其正常工作可能有点像痛苦(特别是当ASP.NET运行时编译ASPX文件时,如果用户修改了ASPX文件,则需要通知它)。您还需要注意ASPX加载与用户的请求路径相关联(除非您使用的是路由或MVC),因此您最好使用ASCX,而不是真的很重要。

一个自定义ASP.NET处理程序,它在自己的CAS沙箱中运行,实现了一个成熟的模板引擎

这是最痛苦的选择,它存在于两者之间:您可以灵活地使用一流的模板引擎(循环,字段,必要时进行评估),而无需打开应用程序,直至出现安全漏洞。缺点是你需要自己构建几乎所有东西。我不会在这里详细介绍。

您选择的选项取决于您的要求。由于用户可以自由设置样式表并定义一些任意的常用HTML而不是直接修改其页面的常规模板,因此MySpace的系统更“皮肤化”而不是“模板化”。

您可以在ASP.NET中轻松实现类似MySpace的系统,假设每个可换肤特征都是作为Control子类实现的,只需扩展您的Render方法以允许插入所述任意HTML 。添加自定义样式表也很简单:只需将其添加到页面<style type="text/css">中的<head>元素内。

当/如果您允许用户直接输入HTML时,我强烈建议您解析它并过滤掉任何危险元素(例如<script><style><object>等)。如果您希望允许嵌入YouTube视频和相关内容,则应分析<object>元素以确保它们实际上是YouTube视频,提取视频ID,然后从已知的可信模板重新创建元素。重要的是,任何自定义HTML都是“标记平衡的”(您可以通过传递严格的XML解析器而不是更宽容的HTML解析器来验证这一点,因为XHTML(技术上)无论如何都是HTML的一个子集),就这样自定义标记不会破坏页面。

玩得开心。