【问题标题】:Where can I find a list of escape characters required for my JSON ajax return type?在哪里可以找到 JSON ajax 返回类型所需的转义字符列表?
【发布时间】:2010-11-02 06:40:08
【问题描述】:

我有一个返回 JSON 对象的 ASP.NET MVC 操作。

JSON:

{status: "1", message:"", output:"<div class="c1"><div class="c2">User generated text, so can be anything</div></div>"}

目前我的 HTML 正在破坏它。输出字段中会有用户生成的文本,所以我必须确保我转义了所有需要转义的内容。

有人列出了我需要逃避的所有事情吗?

我没有使用任何 JSON 库,只是自己构建字符串。

【问题讨论】:

    标签: asp.net-mvc json escaping


    【解决方案1】:

    马上,我可以说,至少 HTML 标签中的双引号会是一个问题。这些可能是您需要转义才能使其成为有效 JSON 的全部内容;直接替换

    "
    

    \"
    

    至于输出用户输入的文本,您确实需要确保通过 HttpUtility.HtmlEncode() 运行它以避免XSS attacks 并确保它不会破坏您的页面格式。

    【讨论】:

    • 解析器对 \ 有一个抱怨,需要用 \\ 进行转义
    【解决方案2】:

    以下是在为 JSON 创建字符串文字时可以转义的特殊字符列表:

    \b 退格(ASCII 代码 08) \f 换页(ASCII 代码 0C) \n 换行 \r 回车 \t 制表符 \v 垂直制表符 \' 撇号或单引号 \" 双引号 \\ 反斜杠字符

    参考:String literals

    其中一些比其他的更可选。例如,无论您是转义制表符还是保留制表符文字,您的字符串都应该是完全有效的。不过,您当然应该处理反斜杠和引号字符。

    【讨论】:

    • 转义/ 也是一个好主意。至少当它是&lt;/script&gt; 的一部分时。
    • 这些是我可以逃脱的,哪些是我必须逃脱的?
    • 而且当 Tab 在引号内时你必须转义它,jsonlint.com 这么说,jquery.parseJSON 这么说。
    • 这个列表是错误的。转义’会产生一个无效的 JSON
    • -1 这个答案是错误的! 您正在使用的参考文档记录了 JavaScript 的转义码(而 OP 询问 JSON 转义码)。您可以在 json.org 上找到 JSON 的官方转义码列表。虽然这两个列表确实有交叉点,但它们并不相同。例如,\' 不是有效的 JSON 转义码,在使用 JSONLint 时会导致验证错误
    【解决方案3】:

    看看http://json.org/。它声称的转义字符列表与 Chris 提议的有所不同。

    \"
    \\
    \/
    \b
    \f
    \n
    \r
    \t
    \u four-hex-digits
    

    【讨论】:

    • 除了完全不清楚哪些字符应该用\uxxxx序列编码...
    • 而且有点不清楚其他大多数人的意思......(不得不向上滚动到@ChrisNielsen 的答案,因为我不认识\f
    • \uXXXX 转义码指定基本多语言平面(U+0000 到 U+FFFF)中的代码点。更多信息请参见官方规范"ECMA-404 The JSON Data Interchange Standard"
    • 为什么不转义大括号?如果这是一个 json 文件并且任何键/值都包含大括号,那么它不会使 json 结构无效吗?
    • @Mugen:不,int、bool 或 float 不能包含 { 或 }。并且字符串总是在双引号之间,所以没有混淆,当然假设你的解析器工作正常。
    【解决方案4】:

    JSON 参考说明:

    任何 Unicode 字符- 除了-"-or-\\-or- 控制字符

    然后列出标准转义码:

    \" 标准 JSON 引用 \\ 反斜杠(转义字符) \/ 正斜杠 \b 退格(ascii 代码 08) \f 换页(ascii 代码 0C) \n 换行 \r 回车 \t 水平制表符 \u 四位十六进制数字

    据此,我假设我需要转义所有列出的,而所有其他的都是可选的。如果您愿意,您可以选择将所有字符编码为\uXXXX,或者您只能使用任何不可打印的 7 位 ASCII 字符或 Unicode 值不在\u0020 &lt;= x &lt;= \u007E 范围(32 - 126) 中的字符。最好先使用标准字符以获得更短的转义码,从而提高可读性和性能。

    此外,您还可以从RFC 4627 读取第 2.5 点(字符串)。

    您可能(或可能不)想要(进一步)转义其他字符,具体取决于您嵌入 JSON 字符串的位置,但这超出了本问题的范围。

    【讨论】:

      【解决方案5】:

      来自spec

      除必须转义的字符外,所有字符都可以放在引号内:引号 (U+0022)、反斜线 [反斜杠] (U+005C) 和控制字符 U+0000 到 U+ 001F

      只是因为例如Bell (U+0007) 没有单字符转义码并不意味着您不需要转义它。使用 Unicode 转义序列\u0007

      【讨论】:

      • 您的 ECMA 规范和 RFC 4627 都声明必须对固相线进行转义,然后都继续举例说明它们不是!这太令人困惑了。你的:"/" RFC:"Url": "http://www.example.com/image/481989943", 我见过的一些 cmets 建议在关注 &lt; 时需要对solidus only进行转义,例如:&lt;\/tag&gt;,但如果是这样的话,为什么规格如此冷漠吗?根据 RFC,我正在逃避固相线,但不习惯在文档中看到它的人向我询问过这个问题。所以我试图给出一个明智的答案,而不是猜测。谢谢。
      • 规范规定必须转义反向固相线。他们没有说必须逃离固相线。即"\/""/" 都是合法的
      【解决方案6】:

      正如官方 ECMA 规范第 9 节所述 (http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf) 在 JSON 中,必须转义以下字符:

      • U+0022",引号)
      • U+005C\,反斜杠或反斜线)
      • U+0000U+001F(ASCII 控制字符)

      此外,为了在 HTML 中安全地嵌入 JSON,还必须对以下字符进行转义:

      • U+002F (/)
      • U+0027 (')
      • U+003C (&lt;)
      • U+003E (&gt;)
      • U+0026 (&amp;)
      • U+0085(下一行)
      • U+2028(行分隔符)
      • U+2029(段落分隔符)

      上面的某些字符可以使用标准中定义的以下短转义序列进行转义:

      • \" 代表引号字符(U+0022)。
      • \\ 代表反斜线字符 (U+005C)。
      • \/ 表示斜线字符 (U+002F)。
      • \b 表示退格字符 (U+0008)。
      • \f 代表换页符 (U+000C)。
      • \n 代表换行符 (U+000A)。
      • \r 代表回车符(U+000D)。
      • \t 表示字符制表符(U+0009)。

      其他需要转义的字符将使用\uXXXX 表示法,即\u 后跟四个编码代码点的十六进制数字。

      \uXXXX 也可以用来代替短转义序列,或者选择性地从基本多语言平面 (BMP) 中转义任何其他字符。

      【讨论】:

      • 您可以为此添加来源吗?
      猜你喜欢
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多