web-dev-qa-db-fra.com

"<" dans une zone de texte dans ASP.NET -> comment l’autoriser?

J'ai un champ de texte qui affiche une chaîne qui contient <et>. Le code génère une erreur à cause de cela. Comment puis-je autoriser l'utilisation de ces caractères dans mon champ de texte?

Merci :)

13
grady

Le problème est que lorsque cela est posté sur le serveur, cela ne fonctionnera pas, peu importe ce que vous essayez. C'est la protection ASP.NET XSS, qui peut être désactivée de la manière suivante:

<%@ Page ... ValidateRequest="false" %>

Le problème, c'est que vous devrez être très prudent en validant vous-même l'ensemble des publications. Le moyen le plus simple est d'échapper à tout le contenu de la zone de texte en utilisant JavaScript juste avant de poster. Vous pouvez y échapper en utilisant le même échappement HTML, puis décompresser dans le code côté serveur.

Mise à jour: Exemple d’échappement. Cela fera clignoter le texte modifié à l’écran avant la publication - la solution idéale consiste à utiliser un champ masqué à cet effet, c’est-à-dire à attribuer une valeur à un champ masqué au lieu du même champ. C'est la version la plus simple:

<script>
  function EscapeField(){
    document.getElementById("your client control ID").value = 
       escape(document.getElementById("your client control ID").value);
  }
</script>

Et en code-behind:

this.ClientScript.RegisterOnSubmitStatement(this.GetType(), 
    "EscapeField", "EscapeField();")

Mise à jour: .__ Encore une fois, avertissement - si vous enregistrez le code HTML dans votre base de données de cette façon, puis affichez-le simplement sur le client, vous êtes directement vulnérable aux attaques XSS. Il existe des vers qui trouveront et exploiteront votre site Web. Assurez-vous de nettoyer le code HTML que vous obtenez.

22
Artemiy

Si vous êtes dans une page asp.net, vous pouvez envelopper le texte de sortie dans une Server.HtmlEncode("YourTextWith<and>Characters") 

fonction et il va encoder tous les caractères douteux pour vous.

Si, pour une raison quelconque, vous le faites dans un fichier .cs, vous pouvez utiliser System.Web.HttpUtility.HtmlEncode("YourTextWith<and>Characters")

avant de le transmettre à la couche de présentation.

8
Paul Spangle

Convertissez-les en &lt; et &gt;. En HTML, &lt; est converti en < et &gt; en > sans qu'il pense qu'il fait partie du balisage. Donc, la chaîne <Blah> sera &lt;Blah&gt;.

Modifier: J'ai oublié, pour les convertir automatiquement et échapper à tous les caractères HTML (ce qui ne pose donc pas de problème pour d'autres choses), dans Asp.net, vous pouvez utiliser Server.HtmlEncode(string) pour convertir automatiquement tous les caractères susceptibles de générer des problèmes en équivalents HTML.

4
KallDrexx

La solution la plus simple consiste à désactiver la validation des demandes dans des pages uniques.

<%@ Page ... ValidateRequest="false" %>

mais n'oubliez pas d'activer requestValidationMode = "2.0" 

<system.web>
   ...
   <httpRuntime requestValidationMode="2.0" />
</system.web>

Cette solution pourrait comporter certaines menaces.


Une autre solution intelligente consiste à remplacer via un texte javascript écrit par l'utilisateur pour le rendre sûr pour la validation: <tag> est considéré comme dangereux, mais < tag> est considéré comme sûr!

Un remplacement javascript peut résoudre le problème.

function validateTxt() {
    $("textarea, input[type='text']").change(function () {
      html = $(this).val(); //get the value
      //.replace("a" , "b")  works only on first occurrence of "a"
      html = html.replace(/< /g, "<"); //before: if there's space after < remove
      html = html.replace(/</g, "< "); // add space after <
      $(this).val(html); //set new value
   });
}

$(document).ready(function () {
      validateTxt();
});
1
Emanuele Greco
<asp:TextBox ID="TextBox1" runat="server">&lt;</asp:TextBox>

Je ne sais pas si votre question est liée à ceci ou si vous obtenez un problème validateRequest

0
kd7

votre problème est que vous ne pouvez pas utiliser de balises HTML dans les contrôles .net. Définissez donc ValidateRequest = "false" dans votre page aspx et codez le texte avant de l'enregistrer.

    //encode
    private string Encode(string text)
    {
        byte[] encodedText = System.Text.Encoding.UTF8.GetBytes(text);
        return System.Convert.ToBase64String(encodedText);
    }

lorsque vous récupérez votre texte, assurez-vous de le décoder.

    // Decode:
    private string Decode(string encodedText)
    {
        byte[] decodedText = System.Convert.FromBase64String(encodedText);
        return System.Text.Encoding.UTF8.GetString(decodedText );
    }
0
user2837480

Vous pouvez soit utiliser la propriété TextBox.Text qui encodera en HTML ce que vous aurez entré

<asp:TextBox ID="TextBox1" runat="server" Text="<>"></asp:TextBox>

ou vous pouvez entrer les noms HTML pour < et >.

<asp:TextBox ID="TextBox1" runat="server">&lt;</asp:TextBox>

ou vous pouvez entrer les codes html

<asp:TextBox ID="TextBox1" runat="server">&#60;</asp:TextBox>

pour les conversions de noms et de codes, consultez this chart.

0
Yuriy Faktorovich