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



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

我一直在绞尽脑汁想办法用.NET做到这一点。我的网站通常使用母版页,但显然这对最终用户不起作用。

我尝试将HTML模板加载为常规文本文件,并对其进行解析以"适应"内容占位符。它听起来很难看。

这里有一些通常被认为是最佳实践的东西,但我肯定找不到

有什么建议吗?

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

有几种方法可以实现这一点。我会给你一个我能想到的所有想法的快速总结:

带有预定义字段的静态HTML

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

如果您擅长字符串处理(即使用状态机解析器来查找curley括号,将重建的字符串直接发送到输出或StringBuilder中,等等,重要的是使用String.Replace而不是),这种方法可能会很快。缺点是它不是一个真正的模板系统:没有提供在结果集上循环(假设您希望允许)、表达式求值,但它适用于简单的"将此内容插入此空间"类型的设计。

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

如果可以使用ASP.NET,为什么要构建自己的模板系统?好吧,如果你想建立一个快速的脏报告系统,这种方法是最简单的,但它在安全方面失败得很厉害。遗憾的是,由于ASP.NET的工作方式,您无法在沙箱中保护ASPX文件中的任何<% %>/<script runat="server">代码,也无法使用CAS(我之前自己研究过这一点:基于逐视图ASP.NET MVC的代码访问安全性)。

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

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

这是最痛苦的选择,它介于两者之间:您可以获得一流模板引擎的灵活性(循环、字段、评估(如果必要)),而无需打开应用程序以暴露巨大的安全缺陷。不利的一面是你需要自己构建几乎所有的东西。我不想在这里详述。

你选择哪个选项取决于你的要求。MySpace的系统与其说是"模板化",不如说是"皮肤化",因为用户可以自由设置样式表和定义一些任意的通用HTML,而不是直接修改页面的通用模板。

你可以很容易地在ASP.NET中实现类似MySpace的系统,假设每个可屏蔽的功能都是作为Control子类实现的,只需扩展你的Render方法,就可以插入所述任意HTML。添加自定义样式表也很容易:只需将其添加到页面的<head>中的<style type="text/css">元素中即可。

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

玩得开心。

相关内容

  • 没有找到相关文章

最新更新