[Security - XSS 類別] 較安全的程式碼撰寫方法 - .NET 控制項篇
前言:
此篇是紀錄 Cross-Site Scripting 類別的問題,以 .NET 控制項做說明。
前置介紹與準備:
針對 XSS 類別問題,微軟有提供 AntiXSSLibrary.dll 元件,處理此類別問題。
安裝 Microsoft Anti-Cross Site Scripting Library V3.1 或者目前最新版的 Microsoft Anti-Cross Site Scripting Library V4.0
V4.0 - AntiXSSLibrary.dll 放置路徑為 「C:\Program Files (x86)\Microsoft Information Security\AntiXSS Library v4.0」
V3.1 - AntiXSSLibrary.dll 放置路徑為 「C:\Program Files (x86)\Microsoft Information Security\Microsoft Anti-Cross Site Scripting Library v3.1\Library」
若有需要,可將 AntiXSSLibrary.dll 加入專案參考使用。
使用方式可參考以下資料:
A. Will保哥的文章: 推薦使用 Microsoft Anti-Cross Site Scripting Library v3.1 與 V3.0
B. 張小呆大的文章:ASP.NET MVC - 實作 Microsoft Anti-Cross Site Scripting (AntiXss)
ASP.NET 控制項介紹與:
(以下 TextBox.Text 輸入 <script>alert('xxx');</script>,即可知道效果)
1. Label 類型:
有資安疑慮的寫法:
string sEMP_NAME = this.txtEMP_NAME.Text;
this.lblMsg.Text = "專案同仁:" + sEMP_NAME + " 新增成功";
較安全的寫法(1):
string sEMP_NAME = this.txtEMP_NAME.Text;
this. lblMsg.Text = "專案同仁:" + Server.HtmlEncode(sEMP_NAME) + " 新增成功";
較安全的寫法(2):
//參考 AntiXSSLibrary.dll
using Microsoft.Security.Application;
string sEMP_NAME = this.txtEMP_NAME.Text;
this. lblMsg.Text = "專案同仁:" + AntiXss.GetSafeHtmlFragment(sEMP_NAME) + " 新增成功";
2. TextBox 類型:
Text 屬性值預設會編碼,不需加 Server.HtmlEncode
TextMode:Single-line 與 MultiLine 故不需另加Server.HtmlEncode
3. HyperLink 類型 (ASP.NET 1.1與 ASP.NET 2.0 相同)
HyperLink.Text:
有資安疑慮的寫法:
string sStr = this.TextBox1.Text;
this.HyperLink1.Text = "請點選 " + sStr + " 至下一頁";
較安全的寫法(1):
string sStr = this.TextBox1.Text;
this.HyperLink1.Text = "請點選 " + Server.HtmlEncode(sStr) + " 至下一頁";
較安全的寫法(2):
//參考 AntiXSSLibrary.dll
using Microsoft.Security.Application;
string sStr = this.TextBox1.Text;
this.HyperLink1.Text = "請點選 " + AntiXss.GetSafeHtmlFragment(sStr) + " 至下一頁";
HyperLink.NavigateUrl 與 ToolTip 皆會編碼,故不用Server.HtmlEncode
4. LinkButton 類型
LinkButton.Text:
有資安疑慮的寫法:
string sStr = this.TextBox1.Text;
this. LinkButton1.Text = "請點選 " + sStr + " 至下一頁";
較安全的寫法(1):
string sStr = this.TextBox1.Text;
this.LinkButton1.Text = "請點選 " + Server.HtmlEncode(sStr) + " 至下一頁";
較安全的寫法(2):
////參考 AntiXSSLibrary.dll
using Microsoft.Security.Application;
string sStr = this.TextBox1.Text;
this.LinkButton1.Text = "請點選 " + AntiXss.GetSafeHtmlFragment(sStr) + " 至下一頁";
5. ImageButton 類型
ImageURL 與 AlternateText 已經過 Encode 的動作,故不用再使用Server.HtmlEncode
6. DropDownList 類型
Option values已經過 Encode 的動作,故不用再使用Server.HtmlEncode
Option display texts已經過 Encode 的動作,故不用再使用Server.HtmlEncode
7. ListBox 類型
Option values已經過 Encode 的動作,故不用再使用Server.HtmlEncode
Option display texts已經過 Encode 的動作,故不用再使用Server.HtmlEncode
8. DataGrid 、 GridView 與 DetailsView 類型
使用 BoundField 時,樣板下的 HtmlEncode 屬性預設為 True,故已被 HtmlEncode 編碼過。
使用 TemplateField 自訂樣板時,DataGrid 與 GridView 為複合式控制項,內容物可以放很多控制項,故相關控制項的修改方是可以參考原先項目的改法。
EX:Label、HyperLink......etc 。前端控制項改法,以 Label 為例:
有資安疑慮的寫法:
<asp:gridview autogeneratecolumns="False" id="GridView1" runat="server">
<columns>
<asp:templatefield headertext="標頭">
<itemtemplate>
<asp:label id="Label1" runat="server" text="<%# Bind("abc") %>">
</itemtemplate>
</asp:templatefield>
</columns>;
</asp:gridview>
較安全的寫法(1):
<itemtemplate>
<asp:label id="Label1" runat="server" text="<%# Server.HtmlEncode((string)Eval("abc").ToString()) %>"></asp:label>
</itemtemplate>
較安全的寫法(2):
<itemtemplate>
<asp:label id="Label1" runat="server" text="<%# Server.HtmlEncode(DataBinder.Eval(Container, "abc").ToString()) %>"></asp:label>
</itemtemplate>
較安全的寫法(3):
參考AntiXSSLibrary.dll
Aspx 頁首 加 <%@ Import Namespace="Microsoft.Security.Application"%>
9. HiddenField 類型:
Value 已經過 Encode 的動作,故不需再進行Server.HtmlEncode
結語說明:
處理資訊安全的做法,大多會讓人覺得繁瑣,但為了系統安全,這是應該做的,因此分享一些比較基礎簡單的寫法,後續亦會逐步更新相關寫法。
以上為的示範,寫法、觀念上不足之處,請大家見諒,也麻煩大家不吝給予指教。
參考資料:
1. Will 保哥 - 推薦使用 Microsoft Anti-Cross Site Scripting Library V3.0 與 推薦使用 Microsoft Anti-Cross Site Scripting Library v3.1
2. 張小呆大 - ASP.NET MVC - 實作 Microsoft Anti-Cross Site Scripting (AntiXss)
3. Kanakaiah's Blog - Talking about What’s wrong with ASP.NET? HTML encoding