【问题标题】:Escaping JavaScript special characters from ASP.NET从 ASP.NET 中转义 JavaScript 特殊字符
【发布时间】:2015-02-16 07:18:46
【问题描述】:

我的 ASP.NET 应用程序中有以下 C# 代码:

string script = @"alert('Message head:\n\n" + CompoundErrStr + " message tail.');";
System.Web.UI.ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Test", script, true);

CompoundErrStr 是 SQL Server 生成的错误消息(从存储过程中冒出的异常文本)。如果它包含任何表列名称,它们会用单引号括起来,并且 JavaScript 在执行期间会中断,因为单引号被视为字符串终止符。

作为对单引号的修复,我将代码更改为:

CompoundErrStr = CompoundErrStr.Replace("'", @"\'");
string script = @"alert('Message head:\n\n" + CompoundErrStr + " message tail.');";
System.Web.UI.ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Test", script, true);

现在可以正常使用了。

但是,还有其他特殊字符需要像这样转义吗?是否有可用于此目的的 .Net 函数?类似于 HttpServerUtility.HtmlEncode 但用于 JavaScript。

编辑我使用 .Net 3.5

【问题讨论】:

  • 您可以使用相同的HttpServerUtility.HtmlEncode,它更可靠,可以将任何特殊字符转换为等效的HTML代码。
  • @Sreenath HtmlEncode 不对 JavaScript 字符串执行转义...
  • "CompoundErrStr" 在附加 javascript 之前应单独编码。
  • Server.HtmlEncode 对单引号没有任何作用。
  • @Joe Schmoe:如果您正在寻找可以对特殊字符进行编码的 JS 函数。您可以尝试使用 js 中的“encodeURIComponent”功能。 w3schools.com/jsref/jsref_encodeuricomponent.asp

标签: javascript c# asp.net .net


【解决方案1】:

注意:对于此任务,您不能(也不应该)使用 HTML 编码器(如 HttpServerUtility.HtmlEncode()),因为 HTML 和 JavaScript 字符串的规则非常不同。一个例子:字符串"Check your Windows folder c:\windows" 将被编码为"Check your Windows folder c:'windows",这显然是错误的。此外,它遵循 HTML 编码规则,因此它不会对 \"' 执行任何转义。只是为了别的东西。


如果您的目标是 ASP.NET Core.NET 5,那么您应该使用 System.Text.Encodings.Web.JavaScriptEncoder 类。


如果您的目标是 .NET 4.x,您可以使用 HttpUtility.JavaScriptStringEncode() 方法。


如果您的目标是 .NET 3.x 和 2.x

你必须编码什么?某些字符必须转义(\"'),因为它们对于 JavaScript 解析器具有 特殊 含义,而其他字符可能会干扰 HTML 解析,因此也应该转义(如果 JS 在 HTML 页面内)。您有两种转义选项:JavaScript 转义字符 或 \uxxxx Unicode 代码点(请注意,\uxxxx 可用于它们全部,但它不适用于干扰 HTML 解析器的字符)。

您可以像这样手动(使用搜索和替换):

string JavaScriptEscape(string text)
{
    return text
        .Replace("\\", @"\u005c")  // Because it's JS string escape character
        .Replace("\"", @"\u0022")  // Because it may be string delimiter
        .Replace("'", @"\u0027")   // Because it may be string delimiter
        .Replace("&", @"\u0026")   // Because it may interfere with HTML parsing
        .Replace("<", @"\u003c")   // Because it may interfere with HTML parsing
        .Replace(">", @"\u003e");  // Because it may interfere with HTML parsing
}

当然,如果您将 用作转义字符,则不应对其进行转义!这种替换对于未知文本(例如来自用户的输入或可能被翻译的文本消息)很有用。请注意,如果字符串用双引号括起来,则不需要转义单引号,并且 vice-versa)。请注意在 C# 代码中保留逐字字符串,否则将在 C# 中执行 Unicode 替换,并且您的客户端将收到未转义的字符串。关于干扰 HTML 解析的说明:现在您很少需要创建 &lt;script&gt; 节点并将其注入 DOM,但这是一种非常常见的技术,并且网络上充满了类似 + "&lt;/s" + "cript&gt;" 的代码解决方法。

注意:我说 blind 转义是因为如果您的字符串包含转义序列(如\uxxxx\t),那么它不应该再次转义。为此,您必须围绕此代码做一些技巧。

如果您的文本来自用户输入并且它可能是多行的,那么您也应该为此做好准备,否则您将破坏 JavaScript 代码,如下所示:

alert("This is a multiline
comment");

只需将.Replace("\n", "\\n").Replace("\r", "") 添加到之前的JavaScriptEscape() 函数即可。


为了完整起见:还有另一种方法,如果您对字符串进行编码 Uri.EscapeDataString(),那么您可以在 JavaScript 中使用 decodeURIComponent() 对其进行解码,但这与其说是一个解决方案,不如说是一个肮脏的把戏。

【讨论】:

  • 优秀的答案!你能澄清一下“盲目替换”是什么意思吗?
  • JavaScriptEscape(@"Column 1\tColumn 2") 将被转义 "Column 1\\tColumn 2"@"\u0032" 将成为 "\\u0032" 可能不是你想要的。无论如何,我的意思是它会转义所有内容,因此当您编写转义序列时(然后需要从字面上复制某些内容),您将不得不在它周围做一些诡计。
  • Uri.EscapeDataString 和 decodeURIComponent 是唯一能帮助我将 URL 转换为 javascript 字符串的“解决方案”
【解决方案2】:

太简单了:

@Html.Raw(myString)

【讨论】:

    【解决方案3】:

    虽然最初的问题提到了 .NET 3.5,但 4.0+ 的用户应该知道您可以使用 HttpUtility.JavaScriptStringEncode("string")

    第二个布尔参数指定是否在结果中包含引号 (true) 或不 (false)。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多