2017-04-24 416 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

你其实是对的,谢谢指出。我编辑了我的答案。 –