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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top