我正在编写一个实用程序,该实用程序接收.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并不是真正的问题。
答案 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文件中读取时,可能需要这样做。