[ASP.NET]防止跨網站(XSS)指令碼攻擊

XSS的是網路上非常常見的攻擊手法,本文主要針對此攻擊手法做說明,並針對.net所提供的Solution進行解讀。

XSS的是網路上非常常見的攻擊手法,本文主要針對此攻擊手法做說明,並針對.net所提供的Solution進行解讀。

下方這是一個在網路論壇很常見的模式,當使用者在TextBox中輸入他要回覆的內容,存檔後將剛剛他打的內容顯示在網頁上,這在一般應用上並沒有什麼大不了。

image

但XSS的攻擊手法就是透過在我們的網頁中植入他想要執行的指令碼,所以這個駭客手段才會被稱為跨網站的指令碼(Cross-Site-Scripting),我們可以試著在以上的TextBox中輸入script語法,如下圖:

image

我們可以猜看看會發生什麼事情,按下存檔後,出現這個訊息:

image

且輸入的結果並沒有出現在畫面上,這點讓我們感到十分的困惑,

image

檢查一下網頁的原始碼,我們發現剛剛輸入的那段文字,已經變成網頁上的一段script語法了,所以很自然的,當html render到那一行時,該script就會被執行了,

image

以上的範例都只是做一些簡單的試驗,如果我壞一點,輸入以下的內容,我們的網站碼上就被綁架了,直接被導到Yahoo的首頁去,讓人不得不恐慌,

image

不過要解決這個問題其實並不難的,微軟本身也有提供了solution,網址在http://msdn2.microsoft.com/en-us/library/aa973813.aspx

我們先來看看上頭這個網頁後端的程式碼,很單純,直接將剛剛使用者輸入的值顯示在Lable上:

01 public partial class _Default : System.Web.UI.Page  
02 {  
03     protected void Page_Load(object sender, EventArgs e)  
04     {  
05
06     }
  
07     protected void Button1_Click(object sender, EventArgs e)  
08     {  
09         Label3.Text = TextBox1.Text;  
10     }
  
11 }

如果我們要避免XSS的問題,如何使用微軟提供的AntiXssLibrary呢?

1.加入參考using Microsoft.Security.Application;

2.在需要編碼的地方加入:AntiXss.HtmlEncode,如下程式碼

01 public partial class _Default : System.Web.UI.Page  
02 {  
03     protected void Page_Load(object sender, EventArgs e)  
04     {  
05
06     }
  
07     protected void Button1_Click(object sender, EventArgs e)  
08     {  
09         Label3.Text = AntiXss.HtmlEncode(TextBox1.Text);  
10     }
  
11 }

修改後我們再次檢視此網頁的執行狀況,使用者輸入的值正確的被顯示在畫面上,且沒有跳出alert訊息了,

image

這是為什麼呢?我們看一下網頁的原始碼,我們發現該段script的特殊符號都被編碼過了,這就是AntiXss.HtmlEncode的作用了,他會將要輸出到畫面上的內容作編碼,然後由瀏覽器在runtime進行解碼,如此一來該段文字就不是以script的方式被執行了。

image

小叮嚀:

1.當我們在處理網頁問題時,檢視原始碼是一個很好用的除錯動作,只要能精準的比對有問題的網頁與沒問題的網頁間的差距,常常可以幫我們解決很多的問題。

2.針對label、span、literal等元件,在render回畫面時,切記要進行編碼才較為保險。

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。