Где я могу найти список 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, просто строю строку сам.

6 ответов

Посмотрите на http://json.org/. Это требует немного другого списка сбежавших персонажей, чем предложил Крис.

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

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

\ b Backspace (код ASCII 08)
\f Подача формы (код ASCII 0C)
\n Новая строка
возврат каретки
\t  Tab
\v Вертикальная вкладка
Апостроф или одиночная цитата
\"Двойная цитата
\\ символ обратной косой черты

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

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

Как объясняется в разделе 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).

Из спецификации:

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

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

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

"

с

\"

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

Ссылка JSON гласит:

 любой-Unicode-характе-
     кроме -"- или - \\ - или-
     контроль символов

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

  \ "Стандартная цитата JSON
  \\ Backslash (Escape char)
  \/ Косая черта
  \b Backspace (код ASCII 08)
  \ f Подача формы (код ASCII 0C)
  \ n Newline
  возврат каретки
  \ t Горизонтальная вкладка
  \ четыре шестнадцатеричные цифры

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

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

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

Другие вопросы по тегам