ASP.NET中的EntryDate屬性
我并沒有對前一節(jié)中的EntryDate屬性進行編碼。這里存在兩個原因說明當在一個頁面中顯示這個EntryDate屬性時我們不需要對這個屬性進行編碼。
首先,一個網站訪問者沒有輸入這個EntryDate屬性的值。該EntryDate屬性的值是通過你的代碼創(chuàng)建的。在這種情況下,一個黑客是不能輸入惡意的代碼。
假定一個網站訪問者的確輸入了該EntryDate屬性的值。因為該EntryDate是作為一個DateTime類型存儲于SQL Server數(shù)據庫中的,所以,一個黑客也不能把惡意的代碼加入到此EntryDate屬性中。因此,當你顯示它時你不需要擔心對這個屬性進行編碼的問題。
一般來說,當一個用戶通過表單上的文本框輸入待提交的內容時才是你應該真正擔心JavaScript注入式攻擊的時候。例如,這樣情況下你應該擔心用戶名稱的顯示問題。如果你允許一個用戶創(chuàng)建他們自己的用戶名,那么,一個用戶有可能會潛在地把一個惡意的JavaScript字符串加入到他們的用戶名(或添加一個指向一個色情圖像的圖像標簽)。
此外,你還應該擔心超級鏈接的問題。因為大多數(shù)博客應用程序都支持匿名用戶把一個超級鏈接提交到他們的網站—當他們對一個博客提交相應的注釋信息時。這種情況下,一個黑客就有可能把惡意的JavaScript加入到該鏈接中。下面是一個簡單的示例:
- <a href="javascript:alert('Something Evil!')">Mr. Hackera>
當你點擊這個鏈接時,即執(zhí)行JavaScript代碼。當然,在本文示例中不會發(fā)生任何惡意的事情。然而,你能夠從頁面上執(zhí)行的確可以竊取表單數(shù)據或cookies的代碼。
你可以使用JavaScript注入式攻擊來竊取cookies數(shù)據。例如,如果你把某一個用戶的信用卡號存儲在一個瀏覽器端的cookie中,那么,你可以把JavaScript注入到該頁面,然后通過使用document.cookie DOM屬性獲取信用卡號。
請注意,ASP.NET表單認證和ASP.NET會話狀態(tài)技術都使用了瀏覽器端的cookies數(shù)據。其中,表單認證依賴于一個存儲在一個名字為.ASPXAUTH的cookie中的認證標識,而會話狀態(tài)則使用了一個名字為ASP.NET_SessionId的cookie。如果你能夠竊取這些cookies數(shù)據,那么你就有能夠模仿合法的網站用戶而竊取用戶會話狀態(tài)信息.
幸好,微軟已經預先采取了必要的預防措施使得很難竊取此表單認證和會話狀態(tài)cookies數(shù)據。這兩種cookie都是屬于HttpOnly類型的 cookie。一個HttpOnly cookie是指一個特殊類型的cookie,你通過客戶端代碼是不能訪問這樣的數(shù)據的,而僅可以從web服務器端讀取此HttpOnly cookies數(shù)據。
微軟Internet Explorer、Firefox和Opera這樣瀏覽器都提供了對于HttpOnly類型cookie的支持。遺憾的是,Safari和一些老式的瀏覽器還沒有提供這種支持。因此,你仍然必須十分仔細地對所有的用戶輸入的數(shù)據進行HTML編碼;否則,一個惡意黑客便有可能竊取表單認證和會話狀態(tài) cookie數(shù)據。
本文的目的是在于強調在進行基于ASP.NET MVC框架開發(fā)時必須重視安全問題。正如在本文中所介紹的,JavaScript注入式攻擊是使用最為頻繁的安全攻擊類型。大多數(shù)web開發(fā)者都不曾花上足夠的時間來考慮這個問題。因此,我希望本文能夠提醒您,當把數(shù)據顯示在一個MVC視圖時應該總是對你的用戶收集數(shù)據進行必要的編碼。以上是介紹ASP.NET中的EntryDate屬性。
【編輯推薦】