2014年11月13日 星期四

[ASP.NET C#] Security - XSS 類別] 較安全的程式碼撰寫方法 - .NET 控制項篇

Reference:http://www.dotblogs.com.tw/wjl0127/archive/2011/08/18/33408.aspx

[Security - XSS 類別] 較安全的程式碼撰寫方法 - .NET 控制項篇

前言:

此篇是紀錄 Cross-Site Scripting 類別的問題,以 .NET 控制項做說明。

前置介紹與準備:

針對 XSS 類別問題,微軟有提供 AntiXSSLibrary.dll 元件,處理此類別問題。
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 加入專案參考使用。
使用方式可參考以下資料:

ASP.NET 控制項介紹與:

(以下 TextBox.Text 輸入 <script>alert('xxx');</script>,即可知道效果)
1. Label 類型
    有資安疑慮的寫法:
1string sEMP_NAME = this.txtEMP_NAME.Text;
2this.lblMsg.Text = "專案同仁:" + sEMP_NAME + " 新增成功";
    較安全的寫法(1):
1string sEMP_NAME = this.txtEMP_NAME.Text;
2this. lblMsg.Text = "專案同仁:" + Server.HtmlEncode(sEMP_NAME) + " 新增成功";
    較安全的寫法(2):
1//參考 AntiXSSLibrary.dll
2using Microsoft.Security.Application;
3string sEMP_NAME = this.txtEMP_NAME.Text;
4this. 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:
    有資安疑慮的寫法:
1string sStr = this.TextBox1.Text;
2this.HyperLink1.Text = "請點選 " + sStr + " 至下一頁";
    較安全的寫法(1):
1string sStr = this.TextBox1.Text;
2this.HyperLink1.Text = "請點選 " + Server.HtmlEncode(sStr) + " 至下一頁";
    較安全的寫法(2):
1//參考 AntiXSSLibrary.dll
2using Microsoft.Security.Application;
3string sStr = this.TextBox1.Text;
4this.HyperLink1.Text = "請點選 " + AntiXss.GetSafeHtmlFragment(sStr) + " 至下一頁";
    HyperLink.NavigateUrl  與 ToolTip 皆會編碼,故不用Server.HtmlEncode
4. LinkButton 類型
    LinkButton.Text:
    有資安疑慮的寫法:
1string sStr = this.TextBox1.Text;
2this. LinkButton1.Text = "請點選 " + sStr + " 至下一頁";
    較安全的寫法(1):
1string sStr = this.TextBox1.Text;
2this.LinkButton1.Text = "請點選 " + Server.HtmlEncode(sStr) + " 至下一頁";
    較安全的寫法(2):
1//參考 AntiXSSLibrary.dll
2using Microsoft.Security.Application;
3string sStr = this.TextBox1.Text;
4this.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
1Aspx 頁首 加 <%@ 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

結語說明:

處理資訊安全的做法,大多會讓人覺得繁瑣,但為了系統安全,這是應該做的,因此分享一些比較基礎簡單的寫法,後續亦會逐步更新相關寫法。
以上為的示範,寫法、觀念上不足之處,請大家見諒,也麻煩大家不吝給予指教。

參考資料:

沒有留言:

張貼留言