gpt4 book ai didi

javascript - 从 ASP.NET 转义 JavaScript 特殊字符

转载 作者:搜寻专家 更新时间:2023-11-01 04:51:49 26 4
gpt4 key购买 nike

我的 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

最佳答案

注意:对于此任务,您不能(也不应该)使用 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
}

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

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

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

alert("This is a multiline
comment");

只需添加 .Replace("\n", "\\n").Replace("\r", "")到上一个JavaScriptEscape()功能。


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

关于javascript - 从 ASP.NET 转义 JavaScript 特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27530729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com