[英]How do I write escape characters verbatim (without escaping) using StreamWriter?
我正在编写一个实用程序,该实用程序接受.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并不是真正的问题。
当您到达此代码时,您的问题已经发生。 String.Format不会将替换后的字符串( {0}
等)中的文字\\n
和\\r
“扩展”到换行符和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文件读取代码,并尝试查找和删除明确扩展这些字符序列的部分。 如果可能的话,这将是更好的通用解决方案。
您需要使用Microsoft的Anti-XSS Library对字符串进行转义。
只是逃避反斜杠。
kvp.Value = kvp.Value.Replace(@"\\", @"\\\\");
从resx文件读取数据时,可能需要执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.