我并没有对前一节中的EntryDate属性进行编码。这里存在两个原因说明当在一个页面中显示这个EntryDate属性时我们不需要对这个属性进行编码。
首先,一个网站访问者没有输入这个EntryDate属性的值。该EntryDate属性的值是通过你的代码创建的。在这种情况下,一个黑客是不能输入恶意的代码。
假定一个网站访问者的确输入了该EntryDate属性的值。因为该EntryDate是作为一个DateTime类型存储于SQL Server数据库中的,所以,一个黑客也不能把恶意的代码加入到此EntryDate属性中。因此,当你显示它时你不需要担心对这个属性进行编码的问题。
一般来说,当一个用户通过表单上的文本框输入待提交的内容时才是你应该真正担心JavaScript注入式攻击的时候。例如,这样情况下你应该担心用户名称的显示问题。如果你允许一个用户创建他们自己的用户名,那么,一个用户有可能会潜在地把一个恶意的JavaScript字符串加入到他们的用户名(或添加一个指向一个色情图像的图像标签)。
此外,你还应该担心超级链接的问题。因为大多数博客应用程序都支持匿名用户把一个超级链接提交到他们的网站—当他们对一个博客提交相应的注释信息时。这种情况下,一个黑客就有可能把恶意的JavaScript加入到该链接中。下面是一个简单的示例:
- <a href="javascript:alert('Something Evil!')">Mr. Hackera>
当你点击这个链接时,即执行JavaScript代码。当然,在本文示例中不会发生任何恶意的事情。然而,你能够从页面上执行的确可以窃取表单数据或cookies的代码。
你可以使用JavaScript注入式攻击来窃取cookies数据。例如,如果你把某一个用户的信用卡号存储在一个浏览器端的cookie中,那么,你可以把JavaScript注入到该页面,然后通过使用document.cookie DOM属性获取信用卡号。
请注意,ASP.NET表单认证和ASP.NET会话状态技术都使用了浏览器端的cookies数据。其中,表单认证依赖于一个存储在一个名字为.ASPXAUTH的cookie中的认证标识,而会话状态则使用了一个名字为ASP.NET_SessionId的cookie。如果你能够窃取这些cookies数据,那么你就有能够模仿合法的网站用户而窃取用户会话状态信息.
幸好,微软已经预先采取了必要的预防措施使得很难窃取此表单认证和会话状态cookies数据。这两种cookie都是属于HttpOnly类型的 cookie。一个HttpOnly cookie是指一个特殊类型的cookie,你通过客户端代码是不能访问这样的数据的,而仅可以从web服务器端读取此HttpOnly cookies数据。
微软Internet Explorer、Firefox和Opera这样浏览器都提供了对于HttpOnly类型cookie的支持。遗憾的是,Safari和一些老式的浏览器还没有提供这种支持。因此,你仍然必须十分仔细地对所有的用户输入的数据进行HTML编码;否则,一个恶意黑客便有可能窃取表单认证和会话状态 cookie数据。
本文的目的是在于强调在进行基于ASP.NET MVC框架开发时必须重视安全问题。正如在本文中所介绍的,JavaScript注入式攻击是使用最为频繁的安全攻击类型。大多数web开发者都不曾花上足够的时间来考虑这个问题。因此,我希望本文能够提醒您,当把数据显示在一个MVC视图时应该总是对你的用户收集数据进行必要的编码。以上是介绍ASP.NET中的EntryDate属性。
【编辑推荐】