如何使用StreamWriter逐字编写转义字符(无需转义)?

时间:2010-04-26 19:29:19

标签: c# string format streamwriter

我正在编写一个实用程序,该实用程序接收.resx文件并创建一个javascript对象,其中包含.resx文件中所有名称/值对的属性。这一切都很好,直到.resx中的一个值为

此经销商接受电子订单。

/ r / n点击此订单从此经销商处订购{0}。

我正在将名称/值对添加到js对象中,如下所示:

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

当kvp.Value =“此经销商接受电子订单./r/nClick从此经销商处订购{0}。”

这会导致StreamWriter.Write()实际在'orders'之间放置换行符。和'点击',这自然搞砸了我的javascript输出。

我用@尝试了不同的东西而没有使用string.Format,但我没有运气。有什么建议吗?

编辑:此应用程序在构建期间运行,以便稍后部署一些javascript文件,因此除了应用程序开发人员之外,任何人都无法访问/运行该应用程序。因此,虽然我显然需要一种方法来逃避字符,但这样的XSS并不是真正的问题。

3 个答案:

答案 0 :(得分:3)

到达此代码时,您的问题已经发生。 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(tab);这对于大多数开发工具来说已经足够了。

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

或者,您可以查看.resx文件读取代码的上游,并尝试查找并删除显式扩展这些字符序列的部分。如果可能的话,这将是一个更好的通用解决方案。

答案 1 :(得分:1)

您需要使用Microsoft的Anti-XSS Library转义字符串。

答案 2 :(得分:1)

逃避反斜杠。

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

当你从resx文件中读取时,可能需要这样做。