您的位置:首页 > 编程语言 > ASP

ASP.NET 4.0: 新的的模板语法代码块 <%: %>

2014-08-16 18:37 323 查看
这是用于替代<%=%>而推出的一种新的页面文件输出语法。

在白皮书中指出,一些站点,特别是ASP.NETMVC推出以后,越来越多的开发人员,选择在页面中使用<%=%>来输出字符串文本,而不是使用ServerControl。这样做本身没有任何问题,也会让页面模板更为简洁,但是这样做却有可能带来安全性的问题:如果使用<%=%>输出来自用户的输入的内容,由于<%=%>语法没有进行HTMLEncode处理,而大多数开发人员一般都不太注意自己对输出文本进行HTMLEncode(我就是其中一个),这样就有可能就会带来XSS的安全性问题。因此,在一些需要显示用户输入内容时,不管使用Response.Write,还是使用<%=
%>(事实上<%=%>的效果等同于Response.Write,关于更多的模板语法请参考:http://quickstarts.asp.net/QuickStartv20/aspnet/doc/pages/syntax.aspx),我们的最佳实践应该都是需要先调用一下HttpUtility.HtmlEncode对文本进行一次Html编码,以保证输出安全。这样做还是稍微有一点点的麻烦,于是<%:
%>就出现了。使用<%:%>的效果等同于我们调用了HtmlEncode以后,再使用<%=%>,实际上就是在保证安全的同时提高生产力。

我们在VS2010中创建的MVC站点,在LogOnUserControl.ascx文件中有这么一段代码:


<%:Html.ActionLink("LogOn","LogOn","Account")%>

它编译的结果如下:

__w.Write(HttpUtility.HtmlEncode(base.Html.ActionLink("LogOn","LogOn","Account")));


这个新的语法原理本身就是这么简单。<%:%>会帮我们进行一次HtmlEncode,但是在一些情况下,我们不希望输出的文本被自动HtmlEncode;或者我们要输出的内容本身已经做过一次HtmlEncode,而且在项目我们希望统一使用<%:%>,那么再使用这个语法将会对文本进行二次编码。在这种情况下,ASP.NET4.0中,还增加了IHtmlString接口,只要你要输出的实例实现了这个接口,HttpUtility.HtmlEncode这个方法将不会对IHtmlString的接口进行Encode,对应的HtmlEncode方法的实现如下:



在ASP.NET4.0,IHtmlString的默认实现是:HtmlString,如下输出代码将不会进行HtmlEncode:

<%:newHtmlString("<strong>HTMLthatisnotencoded</strong>")%>


在MVC2中,我们发现HtmlHelper原来返回的字符串,改为返回MvcHtmlString(由于MVC2的程序集并不直接使用ASP.NET4.0,因此它通过动态类的方式来实现IHtmlString接口),就是这个原因,不希望<%:%>对MVC输出的Html标签进行HtmlEncode,否则在ASP.NET4.0可使用<%:%>将无法正常工作。

这里还要提一点,使用这个语法,不完全保证页面的没有XSS漏洞,例如当用户提交的内容中,使用了不带引号的属性值引用Html标签,一样可能会受到影响。另外,这个语法不进行javascript编码。

原文:http://hjf1223.cnblogs.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐