Где я могу найти список escape-символов, необходимых для моего возвращаемого типа JSON ajax?

У меня есть действие ASP.NET MVC, которое возвращает объект JSON.

JSON:

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

В настоящее время мой HTML разбивает его. В поле вывода будет текст, созданный пользователем, поэтому я должен убедиться, что я убежал от ВСЕХ вещей, которые нужно экранировать.

Есть ли у кого-нибудь список всех вещей, которые мне нужно убежать?

Я не использую библиотеки JSON, просто строю строку.

Ответ 1

Взгляните на http://json.org/. Он требует немного другого списка экранированных символов, чем предложил Крис.

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

Ответ 2

Вот список специальных символов, которые вы можете избежать при создании строкового литерала для JSON:

\b  Backspace (ASCII code 08)
\f  Form feed (ASCII code 0C)
\n  New line
\r  Carriage return
\t  Tab
\v  Vertical tab
\'  Apostrophe or single quote
\"  Double quote
\\  Backslash character

Ссылка: Строковые литералы

Некоторые из них более необязательны, чем другие. Например, ваша строка должна быть абсолютно корректной, если вы избегаете символа табуляции или оставьте в лите. Вы, конечно, должны обрабатывать обратную косую черту и цитировать символы.

Ответ 3

Как поясняется в разделе 9 официальной спецификации ECMA (http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf) в JSON следует избегать следующих символов:

  • U+0022 (", кавычка)
  • U+005C (\, обратная косая черта или обратный солидус)
  • U+0000 до U+001F (управляющие символы ASCII)

Кроме того, чтобы безопасно вставлять JSON в HTML, необходимо также избегать следующих символов:

  • U+002F (/)
  • U+0027 (')
  • U+003C (<)
  • U+003E (>)
  • U+0026 (&)
  • U+0085 (следующая строка)
  • U+2028 (разделитель строк)
  • U+2029 (разделитель абзацев)

Некоторые из вышеуказанных символов могут быть экранированы со следующими короткими escape-последовательностями, определенными в стандарте:

  • \" представляет символ кавычки (U + 0022).
  • \\ представляет обратный символ солидуса (U + 005C).
  • \/ представляет символ солидуса (U + 002F).
  • \b представляет символ обратного пробела (U + 0008).
  • \f представляет символ подачи формы (U + 000C).
  • \n представляет символ линии (U + 000A).
  • \r представляет символ возврата каретки (U + 000D).
  • \t представляет символ табуляции символов (U + 0009).

Другие символы, которые должны быть экранированы, будут использовать нотацию \uXXXX, то есть \u, за которой следуют четыре шестнадцатеричные цифры, которые кодируют кодовую точку.

\uXXXX можно также использовать вместо короткой escape-последовательности или, возможно, вывести любой другой символ из базовой многоязычной плоскости (BMP).

Ответ 4

Сразу же, я могу сказать, что по крайней мере двойные кавычки в тегах HTML будут проблемой. Вероятно, это все, что вам нужно, чтобы убежать, чтобы он был действительным JSON; просто замените

"

с

\"

Что касается вывода текста ввода пользователя, вам нужно убедиться, что вы запустили его через HttpUtility.HtmlEncode(), чтобы избежать атак XSS и чтобы убедиться, что он не испортил форматирование вашей страницы.

Ответ 5

Из spec:

Все символы могут быть помещены в кавычки, за исключением символов, которые должны быть экранированы: кавычка (U + 0022), обратная солидуса [обратная косая черта] (U + 005C) и управляющие символы U + 0000 до U + 001F

Просто потому, что, например, Bell (U + 0007) не имеет односимвольного кода выхода, это не означает, что вам не нужно его избегать. Используйте escape-последовательность Unicode \u0007.

Ответ 6

Ссылка на JSON указывает:

 any-Unicode-character-
     except-"-or-\\-or-
     control-character

Затем перечислены стандартные escape-коды:

  \" Standard JSON quote
  \\ Backslash (Escape char)
  \/ Forward slash
  \b Backspace (ascii code 08)
  \f Form feed (ascii code 0C)
  \n Newline
  \r Carriage return
  \t Horizontal Tab
  \u four-hex-digits

Из этого я предположил, что мне нужно избегать всех перечисленных, а все остальные необязательны. Вы можете выбрать кодировку всех символов в \uXXXX, если хотите, или вы можете использовать только непечатаемые 7-битные символы ASCII или символы с индексом Unicode не в \u0020 <= x <= \u007E range (32 - 126). Предпочтительно сначала использовать стандартные символы для более коротких кодов выхода и, следовательно, улучшить читаемость и производительность.

Кроме того, вы можете прочитать точку 2.5 (строки) из RFC 4627.

Вы можете (или не можете) хотеть (дальше) убегать от других символов в зависимости от того, где вы вставляете эту строку JSON, но это выходит за рамки этого вопроса.