Ric*_*ews 73 javascript c# asp.net ajax encoding
我正在尝试使用RegisterStartUpScript.NET 3.5中的MS ScriptManager 的方法将SQL Server异常的输出传递给客户端.这适用于某些错误,但当异常包含单引号时,警报失败.
我不想只是逃避单引号.是否有一个标准函数我可以调用以逃避任何特殊字符在JavaScript中使用?
string scriptstring = "alert('" + ex.Message + "');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "Alert", scriptstring , true);
Run Code Online (Sandbox Code Playgroud)
编辑:
谢谢@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();
}
}
Run Code Online (Sandbox Code Playgroud)
如下所述 - 原始来源:这里
Rus*_*Cam 180
你看过了HttpUtility.JavaScriptStringEncode吗?
bob*_*nce 10
具有此功能的探针是它不会对封装HTML中通常带外的字符进行编码...因此,如果您尝试"在属性值中包含字符串,或者如果您有带有</script>脚本元素内部序列的字符串.这可能导致脚本注入和XSS.
你可以添加:
case '<':
sb.Append("\\x3C");
break;
case '"':
sb.Append("\\x22");
break;
case '&':
sb.Append("\\x26");
break;
Run Code Online (Sandbox Code Playgroud)
通常,使用标准JSON编码器可能比使用自己的JS字符串文字编码器更好.这将允许您将任何简单的数据类型传递给JS而不仅仅是字符串.
在.NET 3.5中,您可以获得JavaScriptSerializer,但请注意,虽然这会编码<为\u003C(因此输出将适合在<script>元素中使用),但它不会编码&或",因此需要HTML转义才能将此类内容包含在XHTML脚本元素需要属性值和CDATA包装器.
(与许多JSON编码器一样,它也无法对U + 2028 LINE SEPARATOR和U + 2029 PARAGRAPH SEPARATOR字符进行编码.由于转义了所有非ASCII字符,上面的代码确实存在.这会导致'未终止的字符串文字'错误这些字符包含在JS字符串文字中,因为JavaScript无益地将它们视为与ASCII换行符相同.)