ASP.NET MVC并不支持请求校验
对于一个ASP.NET MVC应用程序来说,上述情况显得更为类锐。因为在一个传统型ASP.NETWeb表单应用程序中(不像一个ASP.NET MVC应用程序),你可以依赖于一种称为请求校验的系统特征。请求校验会自动检测是否表单数据来自于一个包含危险的搜索文本的页面。如果你提交了这种包含危险数据的表单数据(例如包括了类括号<或>等字符),那么系统会自动抛出一个异常。
但是,请注意ASP.NET MVC框架目前还没有提供这种请求校验技术。所以,需要由你自己来完全承担这一责任来阻止对一个ASP.NET MVC应用程序的Java Script注入式攻击。
阻止Java Script注入式攻击
阻止Java Script注入攻击其实是很简单的。为此,无论你何时通过一个视图显示检索自某一个用户的文本,请确保一定调用了Html.Encode()。
例如,下面是Index视图的一部分,用于显示顾客的回馈信息:
- <h1>顾客回馈信息</h1>
- <ul>
- <%foreach(SurveysurveyinViewData.Model)
- {%>
- <li>
- <%=survey.EntryDate.ToShortDateString()%>
- —
- <%=survey.Feedback%>
- </li>
- <%}%>
- </ul>
这段代码包含了一个foreach循环,它循环搜索Survey实体。每一个Survey实体的Feedback和EntryDate属性的值都会被显示出来。
为了阻止Java Script注入式攻击,你需要使用Html.Encode()辅助方法。下面展示了编写这种循环的正确方法:
- <h1>CustomerFeedback</h1>
- <ul>
- <%foreach(SurveysurveyinViewData.Model)
- {%>
- <li>
- <%=survey.EntryDate.ToShortDateString()%>
- —
- <%=Html.Encode(survey.Feedback)%>
- </li>
- <%}%>
- </ul>
应该对什么内容进行编码
注意,我并没有对前一节中的EntryDate属性进行编码。这里存在两个原因说明当在一个页面中显示这个EntryDate属性时我们不需要对这个属性进行编码。
首先,一个网站访问者没有输入这个EntryDate属性的值。该EntryDate属性的值是通过你的代码创建的。在这种情况下,一个黑客是不能输入恶意的代码。
假定一个网站访问者的确输入了该EntryDate属性的值。因为该EntryDate是作为一个DateTime类型存储于SQLServer数据库中的,所以,一个黑客也不能把恶意的代码加入到此EntryDate属性中。因此,当你显示它时你不需要担心对这个属性进行编码的问题。
一般来说,当一个用户通过表单上的文本框输入待提交的内容时才是你应该真正担心Java Script注入式攻击的时候。例如,这样情况下你应该担心用户名称的显示问题。如果你允许一个用户创建他们自己的用户名,那么,一个用户有可能会潜在地把一个恶意的Java Script字符串加入到他们的用户名(或添加一个指向一个色情图像的图像标签)。
此外,你还应该担心超级链接的问题。因为大多数博客应用程序都支持匿名用户把一个超级链接提交到他们的网站—当他们对一个博客提交相应的注释信息时。这种情况下,一个黑客就有可能把恶意的Java Script加入到该链接中。下面是一个简单的示例:
- <a href="javascript:alert('Something Evil!')">Mr. Hacker</a>
当你点击这个链接时,即执行JavaScript代码。当然,在本文示例中不会发生任何恶意的事情。然而,你能够从页面上执行的确可以窃取表单数据或cookies的代码。以上是介绍ASP.NET阻止Java Script注入式攻击。
【编辑推荐】