web-dev-qa-db-fra.com

Existe-t-il un moyen standard de coder une chaîne .NET en chaîne JavaScript pour l'utiliser dans MS Ajax?

J'essaie de transmettre la sortie d'une exception SQL Server au client à l'aide de la méthode RegisterStartUpScript de MS ScriptManager dans .NET 3.5. Cela fonctionne bien pour certaines erreurs, mais lorsque l'exception contient des guillemets simples, l'alerte échoue.

Je ne veux pas seulement échapper aux guillemets simples. Existe-t-il une fonction standard que je peux appeler pour échapper à tout caractère spécial à utiliser en JavaScript?

string scriptstring = "alert('" + ex.Message + "');";         
ScriptManager.RegisterStartupScript(this, this.GetType(), "Alert", scriptstring , true);

[~ # ~] éditez [~ # ~] :

Merci @tpeczek, le code presque a fonctionné pour moi :) mais avec un léger amendement (l'échappement des guillemets simples) ça marche un régal.

J'ai inclus ma version modifiée ici ...

public class JSEncode
{
    /// <summary>
    /// Encodes a string to be represented as a string literal. The format
    /// is essentially a JSON string.
    /// 
    /// The string returned includes outer quotes 
    /// Example Output: "Hello \"Rick\"!\r\nRock on"
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    public static string EncodeJsString(string s)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("\"");
        foreach (char c in s)
        {
            switch (c)
            {
                case '\'':
                    sb.Append("\\\'");
                    break;
                case '\"':
                    sb.Append("\\\"");
                    break;
                case '\\':
                    sb.Append("\\\\");
                    break;
                case '\b':
                    sb.Append("\\b");
                    break;
                case '\f':
                    sb.Append("\\f");
                    break;
                case '\n':
                    sb.Append("\\n");
                    break;
                case '\r':
                    sb.Append("\\r");
                    break;
                case '\t':
                    sb.Append("\\t");
                    break;
                default:
                    int i = (int)c;
                    if (i < 32 || i > 127)
                    {
                        sb.AppendFormat("\\u{0:X04}", i);
                    }
                    else
                    {
                        sb.Append(c);
                    }
                    break;
            }
        }
        sb.Append("\"");

        return sb.ToString();
    }
}

Comme mentionné ci-dessous - source originale: ici

73
Rich Andrews
179
Russ Cam

Un problème avec cette fonction est qu'elle n'encode pas les caractères qui sont généralement hors bande dans l'encapsulation du HTML ... donc vous auriez des problèmes si vous essayiez d'inclure une chaîne avec " à l'intérieur d'une valeur d'attribut, ou si vous aviez une chaîne avec la séquence </script> à l'intérieur d'un élément de script. Cela pourrait conduire à l'injection de scripts et à XSS.

Vous pourriez ajouter:

            case '<':
                sb.Append("\\x3C");
                break;
            case '"':
                sb.Append("\\x22");
                break;
            case '&':
                sb.Append("\\x26");
                break;

En général, il serait probablement préférable d'utiliser un encodeur JSON standard que de brasser votre propre encodeur littéral de chaîne JS. Cela vous permettra de passer n'importe quel type de données simple à JS plutôt qu'à de simples chaînes.

Dans .NET 3.5, vous obtenez JavaScriptSerializer , mais notez que bien que cela code pour < à \u003C (donc la sortie pourra être utilisée dans un <script> élément), il n'encode pas & ou ", donc l'échappement HTML serait nécessaire pour inclure un tel contenu dans une valeur d'attribut et un wrapper CDATA serait nécessaire pour les éléments de script XHTML.

(Comme avec de nombreux encodeurs JSON, il ne parvient pas non plus à coder les caractères U + 2028 LINE SEPARATOR et U + 2029 PARAGRAPH SEPARATOR. Le code ci-dessus le fait, car il échappe à tous les caractères non ASCII. Cela provoque des erreurs de "littéral de chaîne non terminée" lorsque ces caractères sont inclus dans un littéral de chaîne JS, car JavaScript les traite de la même manière qu'un ASCII newline.)

10
bobince

Il s'agit d'un ancien thread, mais vous pourriez être intéressé de connaître la bibliothèque Microsoft AntiXSS qui a une méthode de codage Javascript qui fonctionne pour .Net 2 à partir de maintenant.

http://msdn.Microsoft.com/en-gb/security/aa973814.aspx

3
DomBat