2017-04-24 2 views
0

Ci-dessous le code pour lequel j'ai reçu un rapport de checkmarx indiquant qu'il est vulnérable à XSS.it stocké dit que la couche de données obtient des données de la base de données, pour l'élément dt. La valeur de cet élément traverse ensuite le code sans être correctement filtré ou encodé et est finalement affichée à l'utilisateur dans la page ASPX.Prévention de l'attaque de script intersite dans 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> 

Code

derrière

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(); 
} 

Dois-je encoder toutes les valeurs de colonne qui je passe au modèle d'élément ou est-il une autre ligne de code vulnérable. Si son encodage html, comment puis-je l'obtenir. Veuillez me guider à travers cette question.

+4

ne pas enchaîner votre requête sql! –

+0

@ DanielA.White vous avez oublié ce https://xkcd.com/327/ ;-) – Orangesandlemons

+0

Tapez ce qui suit dans votre boîte de texte 'Liam OR 1 = 1' ....: O – Liam

Répondre

-2

Pour empêcher le XSS, vous pouvez ajouter un CustomValidator côté serveur (pour empêcher le contournement de la validation javascript) associé à la zone de texte et configurer la logique du domaine.

Modifier (sous la direction OP): Vous auriez également utiliser des requêtes paramétrées pour éviter les erreurs SQL (utilisateur introduisant des guillemets simples et briser le SQL) et SQL Injection. Editer: Le validateur doit vérifier le code html/js/css malveillant/non autorisé. Pas un expert sur XSS, mais vous pouvez jeter un oeil à OWAS pour de bonnes directives. https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

+0

Nécessite plus de détails. – Liam

+1

Que devrait faire le validateur personnalisé? – user3660473

+0

@Liam édité essayant d'expliquer ce que le CustomValidator devrait vérifier à mon humble avis (je ne suis pas beaucoup dans XSS tho) et reliant à OWASP pour une belle référence. – bradbury9

0

Pour empêcher XSS lors de l'utilisation de TemplateField sur .NET Frameworks 4.0 ou version antérieure, j'utilise Microsoft Web Protection Library sur la page aspx. Sur .NET Framework 4.5 est déjà intégré sur les Frameworks, il n'y a plus besoin de bibliothèque.

Frameworks 4.0 ou plus anciens.

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

Cadres 4,5

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

Cela encoder votre étiquette lors de leur rendu. Utilisez-le uniquement pour le ItemTemplate, le rendu EditItemTemplate a le texte d'entrée html et il sera codé par le framework par défaut.

+0

Notez que la bibliothèque indique explicitement dans sa page d'accueil que c'est dans sa fin de vie et qu'il a été inclus dans le cadre lui-même. – Alejandro

+0

Vous avez raison, merci de le signaler. J'ai édité ma réponse. –