Comment puis-je écrire des caractères d'échappement verbatim (sans échapper) à l'aide StreamWriter?

StackOverflow https://stackoverflow.com/questions/2716253

Question

J'écris un utilitaire qui prend dans un fichier .resx et crée un objet javascript contenant les propriétés pour toutes les paires nom / valeur dans le fichier .resx. Tout cela est bien beau, jusqu'à ce que l'une des valeurs dans le .resx est

Ce concessionnaire accepte les commandes électroniques.

/ r / nCliquer à l'ordre {0} du vendeur.

J'ajoute les paires nom / valeur à l'objet js comme ceci:

streamWriter.Write(string.Format("\n{0} : \"{1}\"", kvp.Key, kvp.Value));

Quand kvp.Value = "Ce vendeur accepte orders./r/nClick électronique à l'ordre {0} du vendeur."

Cela provoque StreamWriter.Write () pour y placer un saut de ligne entre « ordres ». et « Cliquez », qui naturellement vis ma sortie javascript.

J'ai essayé différentes choses avec @ et sans utiliser string.Format, mais je l'ai pas eu de chance. Toutes les suggestions?

Edit: Cette application est exécutée lors de la construction pour obtenir certains fichiers javascript déployés plus tard, donc à aucun moment est accessible à / géré par quelqu'un d'autre que les développeurs d'applications. Ainsi, alors que je dois évidemment un moyen d'échapper à des personnages ici, XSS en tant que tel n'est pas vraiment une préoccupation.

Était-ce utile?

La solution

Votre problème est déjà arrivé au moment où vous arrivez à ce code. String.Format ne « développer » \n littérale et \r dans les chaînes substituées ({0} etc) dans les nouvelles lignes et CR, donc il doit être arrivé à un moment plus tôt, peut-être en lisant le fichier .resx.

Vous avez deux solutions possibles. Un, comme vous avez découvert dans les commentaires à la réponse de DonaldRay, est d'inverser explicitement ce remplacement, et remplacer les nouvelles lignes littérales avec les deux caractères \n:

kvp.Value.Replace("\r",      // <-- replaced by the C# compiler with a literal CR character
                  "\\r");    // <-- "\\" replaced by the C# compiler with a single "\",
                             // leaving the two-char string "\r"

Vous devez faire la même chose pour tous les caractères qui pourraient apparaître dans vos cordes. \ N et \ r sont les plus communs, puis \ t (tabulation); qui est suffisant pour la plupart des outils de dev.

string formatted = kvp.Value.Replace("\r", "\\r")
                            .Replace("\n", "\\n")
                            .Replace("\t", "\\t");

Sinon, vous pouvez regarder en amont le code de lecture de fichiers .resx, et essayer de trouver et enlever la partie qui est en expansion explicitement ces séquences de caractères. Ce serait une meilleure solution générale, si elle est possible.

Autres conseils

Vous devez échapper aux chaînes, à l'aide de Microsoft bibliothèque Anti-XSS .

Juste les backslashs.

kvp.Value = kvp.Value.Replace(@"\", @"\\");

Vous devrez peut-être faire lorsque vous lisez à partir du fichier resx.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top