1

我正在编写一个实用程序,它接收一个 .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 本身并不是一个真正的问题。

4

3 回答 3

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(制表符);对于大多数开发工具来说,这可能已经足够了。

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

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

于 2010-04-26T20:23:03.883 回答
1

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

于 2010-04-26T19:33:07.483 回答
1

只需避开反斜杠。

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

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

于 2010-04-26T19:40:31.850 回答