Причина этого "ускользает" от меня.
JSON экранирует косую черту, поэтому хеш {a: "a/b/c"}
сериализуется как {"a":"a\/b\/c"}
вместо {"a":"a/b/c"}
.
Почему?
Причина этого "ускользает" от меня.
JSON экранирует косую черту, поэтому хеш {a: "a/b/c"}
сериализуется как {"a":"a\/b\/c"}
вместо {"a":"a/b/c"}
.
Почему?
JSON не требует от вас этого, он позволяет это сделать. Он также позволяет использовать "\ u0061" для "A", но это не требуется. Разрешение \/
помогает при встраивании JSON в тег <script>
, который не позволяет </
внутри строк, например Seb.
Некоторые из API AJAX/JSON от Microsoft ASP.NET используют эту лазейку для добавления дополнительной информации, например, дата-время будет отправлено как "\/Date(milliseconds)\/"
. (Yuck)
Спецификация JSON говорит, что вы можете избежать косой черты, но вам не нужно.
Я спросил тот же вопрос некоторое время назад и должен был ответить на него сам. Вот что я придумал:
Кажется, моя первая мысль [что она исходит из 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.
JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES
должен быть по умолчанию, а не (странным) параметром... Как сказать это php-разработчикам?
По умолчанию ДОЛЖНО быть наиболее часто используемым, и (текущим) наиболее широко используемым стандартом, как UTF8. Сколько фрагментов PHP-кода в Github или в другом месте нуждается в этой экзонической "встроенной в HTML" функции?
PHP по умолчанию удаляет косые черты по умолчанию, поэтому, вероятно, это так часто появляется. Я не уверен, почему, но возможно потому, что вставка строки "</script>"
внутри тега <script>
считается небезопасной.
Эта функция может быть отключена, передав флаг JSON_UNESCAPED_SLASHES
, но большинство разработчиков не будут использовать это, поскольку исходный результат уже действителен JSON.
Поскольку JSON по определению является javascript, а по javascript по определению одиночная обратная косая черта не может присутствовать в строке, не являясь частью специального кодированного символа (например, новой строки), тогда вполне логично добавить дополнительный специальный кодированный символ для что это облегчает задачу предотвращения XSS-атак, так что вы можете даже поблагодарить этого гениального человека, которому удалось снять его с включением этого (казалось бы) противоречивого взлома в спецификацию JSON. Они могли бы также добавить те же специальные символы для угловых скобок, но, похоже, нет необходимости делать это, потому что с помощью косой черты нейтрализуют его не более враждебно, и они могут бросать столько угловых скобок в код, сколько им нравится - t позволяет любому сумасшедшему XSS преуспеть.