2011-05-16 2 views
2
ScriptManager.RegisterStartupScript(page, 
    page.GetType(), 
    "KEY", 
    "updateDockTitle('" + ClientID + "', '" + string.Format(format, ChartName, "No Data To Display") + "');".Replace("-", "\\-"), 
    true); 

ChartName a la capacité de contenir des caractères spéciaux (par exemple le diagramme de quelqu'un). Si cette erreur est autorisée, le code atteint le ' alors qu'il ne s'y attendait pas.Une bonne façon d'échapper des caractères de RegisterStartupScript

Quelle est la bonne façon de gérer ce scénario? Ai-je besoin de connaître tous les caractères qui pourraient causer des problèmes et les remplacer par des versions échappées?

Répondre

3

J'ai trouvé cette solution complète à portée de main:

private static readonly Regex scriptTagRegex = new Regex(
    "script", RegexOptions.IgnoreCase | RegexOptions.Multiline); 

/// <summary> 
///  Processes the provided string, creating a quoted JavaScript string literal. 
/// </summary> 
/// <param name="str">The string to process</param> 
/// <returns>A string containing a quoted JavaScript string literal</returns> 
public static string JavaScriptStringLiteral(string str) 
{ 
    var sb = new StringBuilder(); 
    sb.Append("\""); 
    foreach (char c in str) 
    { 
     switch (c) 
     { 
      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("\""); 

    // If a Javascript tag contains "</script>", then it terminates a 
    // script block. Start by replacing each 's'/'S' with an escape 
    // sequence so it doesn't trigger this. 
    return scriptTagRegex.Replace(
     sb.ToString(), 
     m => (m.Value[0] == 's' ? "\\u0073" : "\\u0053") + m.Value.Substring(1)); 
} 

Il doit remplacer tous les caractères invalides JS et assurez-vous qu'il n'y a pas de rupture si votre script est en ligne (ce qui serait dans votre cas). Notez qu'il génère déjà les guillemets pour la chaîne littérale, gardez cela à l'esprit si vous décidez de l'utiliser.

+0

Script utilitaire très utile, merci! –

0

Le point est l'échappement du 'pour votre chaîne Javascript. Vous devez échapper à ce personnage avec un \, ce qui en fait \'

Ainsi, votre code devient

ScriptManager.RegisterStartupScript(page, page.GetType() 
     , "KEY", "updateDockTitle('" + ClientID + "', '" 
            + string.Format(format, ChartName.Replace("'", "\'") 
               , "No Data To Display") 
            + "');".Replace("-", "\\-"), true); 

modifier

Je pense que votre code est faux, la partie qui dit

');".Replace("-", "\\-") 

est inutile. Je voudrais changer votre code pour

ScriptManager.RegisterStartupScript(page, page.GetType() 
     , "KEY", string.Format("updateDockTitle('{0}', '{1}');" 
          , ClientID 
          , string.Format(format 
              , ChartName.Replace("'", "\'").Replace("-", "\\-") 
              , "No Data To Display") 
          ) 
     , true); 

Mais la question est, pourquoi auriez-vous besoin .Replace("-", "\\-")?

Questions connexes