我正在尝试使用.NET 3.5中MS ScriptManager的RegisterStartUpScript
方法将SQL Server异常的输出传递给客户端。这可以很好地处理某些错误,但当异常包含单引号时,警报将失败。
我不想只转义单引号。有没有一个标准函数可以用来转义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();
}
}
如下所述-原始来源:here
发布于 2010-08-20 14:27:40
发布于 2010-05-27 21:19:37
这个函数的一个问题是,它不编码封装HTML时通常带外的字符...因此,如果您试图在属性值中包含一个序列为"
的字符串,或者在一个脚本元素中包含一个序列为</script>
的字符串,那么您将遇到麻烦。这可能会导致脚本注入和XSS。
您可以添加以下内容:
case '<':
sb.Append("\\x3C");
break;
case '"':
sb.Append("\\x22");
break;
case '&':
sb.Append("\\x26");
break;
通常,使用标准JSON编码器可能比使用brew自己的JS字符串编码器更好。这将允许您将任何简单的数据类型传递给JS,而不仅仅是字符串。
在XHTML3.5中得到的是JavaScriptSerializer,但是请注意,虽然这确实将<
编码为\u003C
(因此输出将适合在<script>
元素中使用),但它并不编码&
或"
,因此需要使用HTML转义来将此类内容包含在属性值中,并且需要为XHTML元素使用CDATA包装器。
(与许多JSON编码器一样,它也无法对U+2028行分隔符和U+2029段落分隔符字符进行编码。由于对所有非ASCII字符进行了转义,因此上面的代码会这样做。当这些字符包含在JS字符串文字中时,这会导致“未终止的字符串文字”错误,因为JavaScript毫无帮助地将它们视为ASCII换行符。)
发布于 2015-01-19 22:59:42
这是一个旧的线程,但是你可能会对微软的AntiXSS库感兴趣,它有一个Javascript encode方法,可以在.Net 2之后的版本中工作。
https://stackoverflow.com/questions/2920752
复制相似问题