2015年12月3日 星期四

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


跨網站指令碼(Cross-Site Script; XSS)攻擊是在網路上常見的攻擊手法,

針對網頁在開發時尚未注意到的漏洞,透過植入惡意的代碼來進行攻擊,

最常見的方式是使用JavaScript語法來進行攻擊。

範例如下:

在畫面上拉一個Textbox及Button
  <html>
  <head></head>
  <body>
    <form id="form1" runat="server">
       <div>
           <asp:TextBox ID="Test1_txt" runat="server" Width="300"><asp:TextBox>

            <br /><br />
             <asp:Button ID="Send_Btn" runat="server" Text="Send" OnClick="Send_Btn_Click" />

              <asp:Label ID="Display_lbl" runat="server" Text=""><asp:Label>
         </div>
     </form>
  </body>
</html>

在Textbox裡填上攻擊的語法,

按下Button送出後,Script 會被轉換成網頁上的HTML碼,

而當Html Render到那行Script時,則會被執行,

如下圖,alert語法被執行後彈出視窗,






在撰寫這段程式碼時,筆者發現Chrome及Firefox執行時,

會自動過濾是否為XSS攻擊,若發現是XSS攻擊則而不執行,










【解法】

   1. ASP.NET 本身有提供防範XSS的機制,於Web.config中加上

        <pages validateRequest="true"></pages>

      此行後,會自動對送出的表單進行驗證,若有輸入XSS攻擊語法時,會跳出錯誤訊息,
 
       如下圖



    2. 採用微軟提供的AntiXSSLibrary方式來做避免XSS攻擊

       可先於Nuget中安裝AntiXSS,


      安裝完成後會自動於參考加入AntiXSSLibrary.dll

      並於程式碼參考中加入using Microsoft.Security.Application

      在需要進行編碼的地方加入Encoder.HtmlEncode

    protected void Send_Btn_Click(object sender, EventArgs e)
   {
      Display_lbl.Text=Encoder.HtmlEncode(Test1_Txt.Text);
    }

       執行修改過後的網頁,可看出User輸入的值已正常被呈現在網頁上,
 
    而非彈跳出視窗了,

  原因為Encoder.HTMLEncode將輸入的值先編碼過,

       而瀏覽器在執行時會做解碼,

  因此輸入的值則會被視為文字型態來執行。












參考資訊:
gipi的學習筆記-專案管理、商務簡報技巧部落格
Wiki
Web安全測試之XSS




位置: 台灣臺北

0 意見:

張貼留言