0

下面是我得到 checkmarx 报告的代码,指出它容易受到存储的 XSS 的攻击。它说数据层从数据库中获取数据,用于 dt 元素。然后,该元素的值在未经适当过滤或编码的情况下流经代码,并最终在 aspx 页面中显示给用户。

<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 ClientName=@clientname and Utype=@Normal, 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

2 回答 2

1

为了在 .NET Frameworks 4.0 或更早版本上使用 TemplateField 时防止 XSS,我在 aspx 页面上使用Microsoft Web Protection Library 。在 .NET Framework 4.5 上已经集成在 Frameworks 上,不再需要库。

框架 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 输入文本,默认情况下将由框架编码。

于 2017-10-05T12:18:36.690 回答
-3

为了防止 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

于 2017-04-24T10:59:24.327 回答