首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有一种标准的方法可以将.NET字符串编码成JavaScript字符串以便在MS Ajax中使用?

有没有一种标准的方法可以将.NET字符串编码成JavaScript字符串以便在MS Ajax中使用?
EN

Stack Overflow用户
提问于 2010-05-27 19:45:03
回答 3查看 39K关注 0票数 74

我正在尝试使用.NET 3.5中MS ScriptManager的RegisterStartUpScript方法将SQL Server异常的输出传递给客户端。这可以很好地处理某些错误,但当异常包含单引号时,警报将失败。

我不想只转义单引号。有没有一个标准函数可以用来转义JavaScript中使用的任何特殊字符?

代码语言:javascript
复制
string scriptstring = "alert('" + ex.Message + "');";         
ScriptManager.RegisterStartupScript(this, this.GetType(), "Alert", scriptstring , true);

编辑

谢谢@tpeczek,代码对我来说几乎可以工作了:),但稍微修改一下(单引号的转义),它就能工作了。

我已经在这里包含了我的修改版本...

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

发布于 2010-08-20 14:27:40

票数 185
EN

Stack Overflow用户

发布于 2010-05-27 21:19:37

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

您可以添加以下内容:

代码语言:javascript
复制
            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换行符。)

票数 10
EN

Stack Overflow用户

发布于 2015-01-19 22:59:42

这是一个旧的线程,但是你可能会对微软的AntiXSS库感兴趣,它有一个Javascript encode方法,可以在.Net 2之后的版本中工作。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2920752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档