Come faccio a scrivere i caratteri di escape testualmente (senza fuga) con StreamWriter?
-
01-10-2019 - |
Domanda
Sto scrivendo un programma di utilità che prende in un file RESX e crea un oggetto JavaScript che contiene le proprietà per tutte le coppie nome / valore nel file .resx. Questo è tutto bene, fino a quando uno dei valori nella .resx è
Questo concessionario accetta ordini elettronici.
/ r / nClicca per ordine {0} di questo venditore.
Sto aggiungendo le coppie nome / valore alle js oggetto come questo:
streamWriter.Write(string.Format("\n{0} : \"{1}\"", kvp.Key, kvp.Value));
Quando kvp.Value = "Questo concessionario accetta orders./r/nClick elettronico per ordine {0} di questo venditore."
Questo fa sì che StreamWriter.Write () per posizionare in realtà un ritorno a capo tra 'ordini'. e 'Click', che naturalmente viti fino mia uscita javascript.
Ho provato cose diverse con @ e senza usare string.Format, ma non ho avuto fortuna. Qualche suggerimento?
Edit: Questa applicazione viene eseguita durante la costruzione per ottenere alcuni file JavaScript dispiegati più tardi, quindi in nessun punto è accessibile a / run da chiunque ma gli sviluppatori di app. Così, mentre io, ovviamente, bisogno di un modo per sfuggire caratteri qui, XSS in quanto tale, non è davvero un problema.
Soluzione
Il tuo problema è già accaduto per il momento si arriva a questo codice. String.Format non "espandere" \n
letterale e \r
nelle stringhe sostituiti ({0}
ecc) in ritorno a capo e CR, quindi deve essere successo a un certo punto in precedenza, possibilmente durante la lettura del file .resx.
Hai due possibili soluzioni. Uno, come avete scoperto nei commenti alla risposta di DonaldRay, è di invertire esplicitamente questa sostituzione, e sostituire a capo letterali con i due personaggi \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"
Sarà necessario fare lo stesso per ogni personaggio che potrebbe apparire nelle stringhe. \ N \ r e sono i più comuni, e quindi \ t (tab); questo è probabilmente sufficiente per la maggior parte degli strumenti di sviluppo.
string formatted = kvp.Value.Replace("\r", "\\r")
.Replace("\n", "\\n")
.Replace("\t", "\\t");
In alternativa, si poteva guardare a monte il codice di lettura di file resx, e cercare di trovare e rimuovere la parte che sta espandendo in modo esplicito queste sequenze di caratteri. Questa sarebbe una soluzione migliore in generale, se è possibile.
Altri suggerimenti
Hai bisogno di fuggire le corde, utilizzando Anti-XSS Biblioteca di Microsoft.
Proprio sfuggire le barre inverse.
kvp.Value = kvp.Value.Replace(@"\", @"\\");
Potrebbe essere necessario fare questo quando si sta leggendo dal file resx.