防止跨網站(XSS)指令碼攻擊

摘要:防止跨網站(XSS)指令碼攻擊

什麼是XSS
網頁基本上就是由HTML, CSS, JavaScript所組成,透過Browser來解析與呈現。而網頁上的資料,可能hard-code,可能由DataBase讀出來,可能由使用者透過<input>輸入後再以不同的HTML tag呈現。

這意味著,如果資料來源的『資料本身』,就是由HTML, CSS或JavaScript語法組成,那麼呈現的時候,這些資料就可能變成『可執行的語法』,進而可能導致其他使用者在瀏覽網頁時,被這樣注入的惡意程式碼所影響

 

 

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回畫面時,切記要進行編碼才較為保險。