Frage

Ich schreibe ein Programm, das in einer RESX-Datei nimmt und erstellt ein JavaScript-Objekt enthält Eigenschaften für alle den Namen / Wert-Paare in der RESX-Datei. Das ist alles schön und gut, bis einer der Werte in der .resx heißt

Der Anbieter akzeptiert elektronische Bestellungen.

/ r / nKlicke auf Bestellung {0} von diesem Händler.

Ich füge der Name / Wert-Paare in den js Objekt wie folgt aus:

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

Wenn kvp.Value = "Dieser Händler akzeptiert elektronische orders./r/nClick auf Bestellung {0} von diesem Händler."

Dies bewirkt, dass StreamWriter.Write (), um tatsächlich eine neue Zeile platzieren zwischen Aufträgen. " und 'Click', die natürlich vermasselt meine Javascript Ausgabe.

Ich habe verschiedene Dinge mit @ versucht und ohne string.Format, aber ich habe kein Glück gehabt. Irgendwelche Vorschläge?

Edit: Diese Anwendung wird während der Build läuft später entfalteten einige Javascript-Dateien zu erhalten, also an keiner Stelle zugänglich zu / läuft von jedermann, aber dem App-Entwickler. Während ich also offensichtlich einen Weg brauchen Zeichen zu entkommen hier, XSS als solche ist nicht wirklich ein Problem.

War es hilfreich?

Lösung

Ihr Problem wurde bereits von der Zeit, die Sie an diesem Code erhalten passiert ist. String.Format nicht „erweitern“ wörtlichen \n und \r in den substituierten Strings ({0} usw.) in Newline und CR, so dass es zu einem frühen Punkt passierte sein muss, möglicherweise während der RESX-Datei zu lesen.

Sie haben zwei mögliche Lösungen. Eine, wie Sie in den Kommentaren zu DonaldRay Antwort entdeckt, ist explizit diesen Ersatz umzukehren, und ersetzen wörtliche Zeilenumbrüche mit den beiden Zeichen \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"

Sie müssen das gleiche für jedes Zeichen tun, die in den Saiten erscheinen könnten. \ N und \ r sind die häufigsten und dann \ t (tab); das ist wahrscheinlich genug für die meisten Entwickler-Tools.

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

Alternativ können Sie in der RESX-Datei Lesecode aussehen stromaufwärts, und versuchen, den Teil zu finden und zu entfernen, die diese Zeichenfolgen explizit ist zu erweitern. Dies wäre eine bessere allgemeine Lösung, wenn es möglich ist.

Andere Tipps

Sie müssen die Saiten entkommen, mit Microsofts Anti-XSS-Bibliothek .

Sie einfach die Schrägstriche entkommen.

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

Sie können dies tun müssen, wenn Sie von der resx Datei lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top