是否有标准的方法将.NET 字符串编码为 JavaScript 字符串以便在 MS Ajax 中使用?

中的 MS ScriptManager 的 RegisterStartUpScript方法将 SQLServer 异常的输出传递给客户端。NET 3.5.对于某些错误,这种方法可以很好地工作,但是当异常包含单引号时,警报就会失败。

但是我不想仅仅逃避单引号。有没有一个标准的函数我可以调用转义任何特殊的字符在 JavaScript 中使用?

string scriptstring = "alert('" + ex.Message + "');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "Alert", scriptstring , true);

编辑:

谢谢@tpeczek,代码 差不多对我来说很有用:)但是稍加修改(单引号的转义)就很有用了。

我在这里加入了我的修正版本。

public class JSEncode
{
/// <summary>
/// Encodes a string to be represented as a string literal. The format
/// is essentially a JSON string.
///
/// The string returned includes outer quotes
/// Example Output: "Hello \"Rick\"!\r\nRock on"
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string EncodeJsString(string s)
{
StringBuilder sb = new StringBuilder();
sb.Append("\"");
foreach (char c in s)
{
switch (c)
{
case '\'':
sb.Append("\\\'");
break;
case '\"':
sb.Append("\\\"");
break;
case '\\':
sb.Append("\\\\");
break;
case '\b':
sb.Append("\\b");
break;
case '\f':
sb.Append("\\f");
break;
case '\n':
sb.Append("\\n");
break;
case '\r':
sb.Append("\\r");
break;
case '\t':
sb.Append("\\t");
break;
default:
int i = (int)c;
if (i < 32 || i > 127)
{
sb.AppendFormat("\\u{0:X04}", i);
}
else
{
sb.Append(c);
}
break;
}
}
sb.Append("\"");


return sb.ToString();
}
}

如下所述-原始来源: 给你

39544 次浏览

这个函数的一个问题是,它没有编码在封装 HTML 时通常带外的字符... ... 所以如果你试图在属性值中包含一个包含 "的字符串,或者在脚本元素中包含一个包含序列 </script>的字符串,你会遇到麻烦。这可能导致脚本注入和 XSS。

你可以加上:

            case '<':
sb.Append("\\x3C");
break;
case '"':
sb.Append("\\x22");
break;
case '&':
sb.Append("\\x26");
break;

一般来说,使用标准的 JSON 编码器可能比酿造自己的 JS 字符串文字编码器更好。这将允许您向 JS 传递任何简单的数据类型,而不仅仅是字符串。

进去。NET 3.5你会得到 JavaScriptSerializer,但是请注意,虽然这个 是的编码 <\u003C(因此输出将适合在 <script>元素中使用) ,它的 没有编码 &",所以 HTML 转义将需要包含这样的内容在一个属性值和 CDATA 包装将需要 XHTML 脚本元素。

(与许多 JSON 编码器一样,它也无法对 U + 2028行分隔符和 U + 2029段分隔符进行编码。由于转义了所有非 ASCII 字符,所以上面的代码可以。当这些字符被包含在 JS 字符串文字中时,这会导致“未终止的字符串文字”错误,因为 JavaScript 无助地将它们与 ASCII 换行符一样对待。)

这是一个老线程,但是您可能有兴趣了解 Microsoft AntiXSS 库,它有一个 Javascript encode 方法。净值2起。

Http://msdn.microsoft.com/en-gb/security/aa973814.aspx