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

[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.1V3.0

B. 張小呆大的文章:ASP.NET MVC - 實作 Microsoft Anti-Cross Site Scripting (AntiXss)

C. Allen Kuo 大的文章:較安全的文字呈現方式

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

4. Allen Kuo 大的文章:較安全的文字呈現方式