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

У меня есть действие 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 ]

74 голосов
/ 29 сентября 2011

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

\"
\\
\/
\b
\f
\n
\r
\t
\u four-hex-digits
51 голосов
/ 20 июня 2009

Вот список специальных символов, которые вы можете использовать при создании строкового литерала для 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

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

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

10 голосов
/ 05 марта 2015

Как описано в разделе 9 официальной спецификации ECMA (http://www.ecma -international.org / публикации / файлы / 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).

5 голосов
/ 27 февраля 2014

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

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

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

5 голосов
/ 12 июня 2009

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

"

с

\"

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

4 голосов
/ 30 октября 2013

Ссылка 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 диапазон (32 - 126). Желательно сначала использовать стандартные символы для более коротких управляющих кодов и, таким образом, улучшить читаемость и производительность.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...