Как я могу написать побег персонажей Verbatim (без выхода), используя streamwriter?
-
01-10-2019 - |
Вопрос
Я пишу утилиту, которая принимает в файле .resx и создает объект JavaScript, содержащий свойства для всех пар имени / значения в файле .resx. Это все хорошо и хорошо, до одного из ценностей в .resx не
Этот дилер принимает электронные заказы.
/ r / nclick на заказ {0} от этого дилера.
Я добавляю пары имени / значения в объект JS, как это:
streamWriter.Write(string.Format("\n{0} : \"{1}\"", kvp.Key, kvp.Value));
Когда kvp.value = "Этот дилер принимает электронные заказы ./r/nklick на заказ {0} от этого дилера".
Это приводит к тому, что streamwriter.write () фактически разместить новую линию между «заказами». И «Нажмите», который естественным образом закручивает свой выход JavaScript.
Я пробовал разные вещи с @ и без использования string.format, но мне не повезло. Какие-либо предложения?
Редактировать: Это приложение запущено во время сборки, чтобы получить некоторые файлы JavaScript, развернутые позже, поэтому в той же точке не доступен в / запустить ни всех, кроме разработчиков приложений. Поэтому, хотя я, очевидно, нужен способ избежать здесь персонажей, XSS, как таковое не очень беспокоит.
Решение
Ваша проблема уже произошла к тому времени, когда вы попадаете в этот код. String.format не будет "расширить" литерал \n
а также \r
в замещенных струнах ({0}
и т. Д.) В новой строке и CR, поэтому он должен произойти в какой-то более ранней точке, возможно, при чтении файла .resx.
У вас есть два возможных решения. Один, как вы обнаружили в комментариях к ответу Доналдрай, это явно обратить вспять эту замену и заменить буквальные новости с двумя персонажами \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 (вкладками); Это, вероятно, достаточно для большинства разработчиков DEV.
string formatted = kvp.Value.Replace("\r", "\\r")
.Replace("\n", "\\n")
.Replace("\t", "\\t");
В качестве альтернативы, вы можете выглядеть вверх по течению на коде чтения файла .resx и попробуйте найти и удалить деталь, которая явно расширяет эти последовательности символов. Это было бы лучшее общее решение, если это возможно.
Другие советы
Вы должны избежать строк, используя Microsoft's Анти-XSS Библиотека.
Просто избегайте обратных створок.
kvp.Value = kvp.Value.Replace(@"\", @"\\");
Возможно, вам понадобится сделать это, когда вы читаете из файла RESX.