2017-04-24 165 views
0

下面是我得到checkmarx報告的代碼,說明它容易存儲XSS.it,說數據層從dt數據庫中獲取數據。然後,此元素的值將流經代碼,而不會被正確過濾或編碼爲 ,最終會在aspx頁面中顯示給用戶。防止asp.net中的跨站點腳本攻擊C#

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowCancelingEdit="GridView1_RowCancelingEdit" 
OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" OnRowDeleting="GridView1_OnRowDeleting" OnPageIndexChanging="GridView1_PageIndexChanging" Width ="1000px" class="grid"> 
<Columns> 
    <asp:TemplateField HeaderText="User Name"> 
     <ItemTemplate> 
      <asp:Label ID="lbl_Name" runat="server" Text='<%#Eval("Uname") %>'></asp:Label> 
     </ItemTemplate> 
     <EditItemTemplate> 
      <asp:TextBox ID="txt_Name" runat="server" Text='<%#Eval("Uname") %>'></asp:TextBox> //this is the line vulnerable to XSS 
     </EditItemTemplate> 
    </asp:TemplateField>  
</Columns> 

代碼背後

DataTable dt = new DataTable(); 
    try 
    { 
     SqlConnection con = new SqlConnection(conn); 
     con.Open(); 
     SqlDataAdapter adapt = new SqlDataAdapter("Select Uid,Uname,Utype,Uemail,ClientName,ProjectName,Ulog from usrtable where [email protected] and [email protected], con); 
    adapt.SelectCommand.Parameters.AddWithValue("@clientname", clientname); 
adapt.SelectCommand.Parameters.AddWithValue("@Normal", "Normal");   
    adapt.Fill(dt); 
     con.Close(); 
    } 



if (dt.Rows.Count > 0) 
{ 
    GridView1.DataSource = dt; 
    GridView1.DataBind(); 
} 

我應該編碼所有這些正在傳遞到項目模板或者是它的代碼容易受到任何其他行的列值。如果它的html編碼,我該如何實現它。請通過這個問題指導我。

+4

不要字符串concat你的sql查詢! –

+0

@ DanielA.White您忘記了這個https://xkcd.com/327/ ;-) – Orangesandlemons

+0

在您的文本框中輸入以下內容:'Liam OR 1 = 1' .... O – Liam

回答

-2

爲了防止XSS,您可以添加與文本框關聯的服務器端CustomValidator(以防止javascript驗證旁路)並設置域邏輯。

編輯(OP編輯):您還希望使用參數化查詢來避免SQL錯誤(用戶引入單引號並打破SQL)和SQL注入

編輯:驗證器應檢查惡意/不允許的html/js/css代碼。不是XSS專家,但你可以看看OWAS的指導方針。 https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

+0

需要更多詳細信息。 – Liam

+1

自定義驗證程序應該做什麼? – user3660473

+0

@Liam編輯試圖解釋什麼CustomValidator應該檢查恕我直言(即時通訊沒有太多XSS壽)和鏈接到OWASP的一個很好的參考。 – bradbury9

0

爲了防止在.NET Frameworks 4.0或更舊版本上使用TemplateField時出現XSS,我在aspx頁面上使用Microsoft Web Protection Library。 在.NET Framework 4.5上已經集成了框架,不再需要庫。

框架4.0或更舊。

<ItemTemplate> 
<asp:Label ID="Name" runat="server" 
    Text='<%#Microsoft.Security.Application.Encoder.HtmlEncode(Eval("Name").ToString()) %>'> 
</asp:Label> 

框架4.5

<ItemTemplate> 
<asp:Label ID="Name" runat="server" 
    Text='<%#System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode(Eval("Name").ToString(),true) %>'> 
</asp:Label> 

這將編碼您的標籤時,他們呈現。僅將它用於ItemTemplate,EditItemTemplate呈現具有html輸入文本,默認情況下它將由框架編碼。

+0

請注意,圖書館在其主頁中明確指出,該圖書館已進入生命週期,並且已納入框架本身。 – Alejandro

+0

你其實是對的,謝謝指出。我編輯了我的答案。 –