Best way to store JSON in an HTML attribute?

后端 未结 9 1532
梦毁少年i
梦毁少年i 2020-11-30 19:57

I need to put a JSON object into an attribute on an HTML element.

  1. The HTML does not have to validate.

    Answered by Quenti

9条回答
  •  心在旅途
    2020-11-30 20:23

    Depending on where you put it,

    • In a
      as you asked, you need to ensure that the JSON does not contain HTML specials that could start a tag, HTML comment, embedded doctype, etc. You need to escape at least <, and & in such a way that the original character does not appear in the escaped sequence.
    • In or escaping text boundary: .
    • In event handlers you need to ensure that the JSON preserves its meaning even if it has things that look like HTML entities and does not break attribute boundaries (" or ').

    For the first two cases (and for old JSON parsers) you should encode U+2028 and U+2029 since those are newline characters in JavaScript even though they are allowed in strings unencoded in JSON.

    For correctness, you need to escape \ and JSON quote characters and it's never a bad idea to always encode NUL.

    If the HTML might be served without a content encoding, you should encode + to prevent UTF-7 attacks.

    In any case, the following escaping table will work:

    • NUL -> \u0000
    • CR -> \n or \u000a
    • LF -> \r or \u000d
    • " -> \u0022
    • & -> \u0026
    • ' -> \u0027
    • + -> \u002b
    • / -> \/ or \u002f
    • < -> \u003c
    • > -> \u003e
    • \ -> \\ or \u005c
    • U+2028 -> \u2028
    • U+2029 -> \u2029

    So the JSON string value for the text Hello, ! with a newline at the end would be "Hello, \u003cWorld\u003e!\r\n".

提交回复
热议问题