[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
ASP.NET 控制項介紹與:
(以下 TextBox.Text 輸入 <script>alert('xxx');</script>,即可知道效果)
1. Label 類型:
有資安疑慮的寫法:
1 | string sEMP_NAME = this .txtEMP_NAME.Text; |
2 | this .lblMsg.Text = "專案同仁:" + sEMP_NAME + " 新增成功" ; |
較安全的寫法(1):
1 | string sEMP_NAME = this .txtEMP_NAME.Text; |
2 | this . lblMsg.Text = "專案同仁:" + Server.HtmlEncode(sEMP_NAME) + " 新增成功" ; |
較安全的寫法(2):
1 | //參考 AntiXSSLibrary.dll |
2 | using Microsoft.Security.Application; |
3 | string sEMP_NAME = this .txtEMP_NAME.Text; |
4 | 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:
有資安疑慮的寫法:
1 | string sStr = this .TextBox1.Text; |
2 | this .HyperLink1.Text = "請點選 " + sStr + " 至下一頁" ; |
較安全的寫法(1):
1 | string sStr = this .TextBox1.Text; |
2 | this .HyperLink1.Text = "請點選 " + Server.HtmlEncode(sStr) + " 至下一頁" ; |
較安全的寫法(2):
1 | //參考 AntiXSSLibrary.dll |
2 | using Microsoft.Security.Application; |
3 | string sStr = this .TextBox1.Text; |
4 | this .HyperLink1.Text = "請點選 " + AntiXss.GetSafeHtmlFragment(sStr) + " 至下一頁" ; |
HyperLink.NavigateUrl 與 ToolTip 皆會編碼,故不用Server.HtmlEncode
4. LinkButton 類型
LinkButton.Text:
有資安疑慮的寫法:
1 | string sStr = this .TextBox1.Text; |
2 | this . LinkButton1.Text = "請點選 " + sStr + " 至下一頁" ; |
較安全的寫法(1):
1 | string sStr = this .TextBox1.Text; |
2 | this .LinkButton1.Text = "請點選 " + Server.HtmlEncode(sStr) + " 至下一頁" ; |
較安全的寫法(2):
1 | //參考 AntiXSSLibrary.dll |
2 | using Microsoft.Security.Application; |
3 | string sStr = this .TextBox1.Text; |
4 | 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 為例:
有資安疑慮的寫法:
1 | < asp:gridview autogeneratecolumns = "False" id = "GridView1" runat = "server" > |
2 | < columns > |
3 | < asp:templatefield headertext = "標頭" > |
4 | < itemtemplate > |
5 | < asp:label id = "Label1" runat = "server" text="<%# Bind("abc") %>"> |
6 | </ asp:label ></ itemtemplate > |
7 | </ asp:templatefield > |
8 | </ columns > |
9 | </ asp:gridview > |
較安全的寫法(1):
1 | < itemtemplate > |
2 | < asp:label id = "Label1" runat = "server" text="<%# Server.HtmlEncode((string)Eval("abc").ToString()) %>"> |
3 | </ asp:label ></ itemtemplate > |
較安全的寫法(2):
1 | < itemtemplate > |
2 | < asp:label id = "Label1" runat = "server" text="<%# Server.HtmlEncode(DataBinder.Eval(Container, "abc").ToString()) %>"> |
3 | </ asp:label ></ itemtemplate > |
較安全的寫法(3):
參考AntiXSSLibrary.dll
1 | Aspx 頁首 加 <%@ Import Namespace="Microsoft.Security.Application"%> |
2 | < asp:label id = "Label1" runat = "server" text="<%# AntiXss.HtmlAttributeEncode(Eval("abc").ToString()) %>"></ asp:label > |
9. HiddenField 類型:
Value 已經過 Encode 的動作,故不需再進行Server.HtmlEncode
結語說明:
處理資訊安全的做法,大多會讓人覺得繁瑣,但為了系統安全,這是應該做的,因此分享一些比較基礎簡單的寫法,後續亦會逐步更新相關寫法。
以上為的示範,寫法、觀念上不足之處,請大家見諒,也麻煩大家不吝給予指教。
參考資料:
1. Will 保哥 - 推薦使用 Microsoft Anti-Cross Site Scripting Library V3.0 與 推薦使用 Microsoft Anti-Cross Site Scripting Library v3.1
3. Kanakaiah's Blog - Talking about What’s wrong with ASP.NET? HTML encoding
沒有留言:
張貼留言