JSON: почему удары с косой чертой исчезли?

Причина этого "ускользает" от меня.

JSON экранирует косую черту, поэтому хеш {a: "a/b/c"} сериализуется как {"a":"a\/b\/c"} вместо {"a":"a/b/c"}.

Почему?

Ответ 1

JSON не требует от вас этого, он позволяет это сделать. Он также позволяет использовать "\ u0061" для "A", но это не требуется. Разрешение \/ помогает при встраивании JSON в тег <script>, который не позволяет </ внутри строк, например Seb.

Некоторые из API AJAX/JSON от Microsoft ASP.NET используют эту лазейку для добавления дополнительной информации, например, дата-время будет отправлено как "\/Date(milliseconds)\/". (Yuck)

Ответ 2

Спецификация JSON говорит, что вы можете избежать косой черты, но вам не нужно.

Ответ 3

Я спросил тот же вопрос некоторое время назад и должен был ответить на него сам. Вот что я придумал:

Кажется, моя первая мысль [что она исходит из JavaScript корни] были правильными.

'\/' === '/' в JavaScript, а JSON - действительный JavaScript. Однако, почему другие игнорируемые escape-последовательности (например, \z) не разрешены в JSON?

Ключом для этого было чтение http://www.cs.tut.fi/~jkorpela/www/revsol.html, за которым следует http://www.w3.org/TR/html4/appendix/notes.html#h-B.3.2. Особенность слэш позволяет JSON быть встроенным в HTML (как SGML) и XML.

Ответ 4

Уродливый PHP!

JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES должен быть по умолчанию, а не (странным) параметром... Как сказать это php-разработчикам?

По умолчанию ДОЛЖНО быть наиболее часто используемым, и (текущим) наиболее широко используемым стандартом, как UTF8. Сколько фрагментов PHP-кода в Github или в другом месте нуждается в этой экзонической "встроенной в HTML" функции?

Ответ 5

PHP по умолчанию удаляет косые черты по умолчанию, поэтому, вероятно, это так часто появляется. Я не уверен, почему, но возможно потому, что вставка строки "</script>" внутри тега <script> считается небезопасной.

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

Ответ 6

Поскольку JSON по определению является javascript, а по javascript по определению одиночная обратная косая черта не может присутствовать в строке, не являясь частью специального кодированного символа (например, новой строки), тогда вполне логично добавить дополнительный специальный кодированный символ для что это облегчает задачу предотвращения XSS-атак, так что вы можете даже поблагодарить этого гениального человека, которому удалось снять его с включением этого (казалось бы) противоречивого взлома в спецификацию JSON. Они могли бы также добавить те же специальные символы для угловых скобок, но, похоже, нет необходимости делать это, потому что с помощью косой черты нейтрализуют его не более враждебно, и они могут бросать столько угловых скобок в код, сколько им нравится - t позволяет любому сумасшедшему XSS преуспеть.