Как написать экранирующие символы дословно (без экранирования) с помощью StreamWriter? - PullRequest
1 голос
/ 26 апреля 2010

Я пишу утилиту, которая берет файл .resx и создает объект javascript, содержащий свойства для всех пар имя / значение в файле .resx. Это все хорошо, пока одно из значений в .resx не будет равно

Этот дилер принимает электронные заказы.

/ r / nНажмите, чтобы заказать {0} у этого дилера.

Я добавляю пары имя / значение в объект js следующим образом:

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

Когда kvp.Value = "Этот дилер принимает электронные заказы ./r/nНажмите, чтобы заказать {0} у этого дилера."

Это заставляет StreamWriter.Write () фактически помещать новую строку между «заказами». и «Щелчок», который естественно портит мой вывод JavaScript.

Я пробовал разные вещи с @ и без использования string.Format, но мне не повезло. Есть предложения?

Редактировать: Это приложение запускается во время сборки, чтобы позднее развернуть некоторые файлы javascript, поэтому ни в коем случае оно не доступно и не запускается никем, кроме разработчиков приложений. Поэтому, хотя мне явно нужен способ экранирования символов, XSS как таковой на самом деле не представляет проблемы.

Ответы [ 3 ]

3 голосов
/ 27 апреля 2010

Ваша проблема уже возникла к тому времени, как вы получили этот код.String.Format не будет «расширять» литерал \n и \r в замещаемых строках ({0} и т. Д.) В символы новой строки и CR, поэтому это должно было произойти в более ранний момент, возможно, при чтении файла .resx.

У вас есть два возможных решения.Один из них, как вы обнаружили в комментариях к ответу DonaldRay, состоит в том, чтобы явно отменить эту замену и заменить буквальные символы новой строки двумя символами \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"

Вам нужно будет сделать то же самое для каждого символаэто может появиться в ваших строках.\ n и \ r являются наиболее распространенными, а затем \ t (вкладка);этого, вероятно, достаточно для большинства инструментов разработки.

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

В качестве альтернативы, вы можете посмотреть вверх по течению код чтения файла .resx и попытаться найти и удалить часть, которая явно расширяет эти последовательности символов.Это было бы лучшим общим решением, если это возможно.

1 голос
/ 26 апреля 2010

Просто избежать обратной косой черты.

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

Возможно, вам придется сделать это, когда вы читаете из файла resx.

1 голос
/ 26 апреля 2010

Вам нужно экранировать строки, используя Microsoft Anti-XSS Library .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...