json.dumps (): экранирование от косой черты

4

Так как косые черты могут встречаться только в строках внутри сериализованного объекта JSON и не экранируются (в настройках по умолчанию), используя

json.dump(some_dict).replace('/', r'\/')

надежно работает, но выглядит хаки.

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

Есть ли способ, чтобы позволить JSONEncoder сбежать с помощью косой черты без ручного экранирования?

  • 1
    Зачем вам нужно бежать от них? Какой вариант использования требует побега? Любой разумный JSON-декодер должен уметь обрабатывать неэкранированные косые черты.
  • 0
    экранирование прямой косой черты в json не требуется, поэтому нет оснований ожидать, что кодировщик json будет поддерживать экранирующую косую черту (или любой другой произвольный символ).
Показать ещё 1 комментарий
Теги:
python-2.7
serialization
escaping

1 ответ

5
Лучший ответ

Удалять только косые черты, когда encode_html_chars = True

Проверьте это - https://github.com/esnme/ultrajson/pull/114

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

Вот решение, чтобы сделать это в самом JSONEncoder. Просто, что вы создаете СЦЕНАРИЙ ESCAPE и делаете вычисления перед рукой и позже делаете кодировку.

https://chromium.googlesource.com/external/googleappengine/python/+/dc33addea2da464ca07e869cb11832e1ae82da9d/lib/django/django/utils/simplejson/encoder.py

Надеюсь, что это поможет.

-

Добавляя к вышеуказанному решению, есть еще одна причина избежать символов. Как сказал kay, это дает нам дополнительный сон. Он предотвращает атаку. Таким образом, решение выше заботится обо всех проблемах.

ESCAPE_DCT = {
    # escape all forward slashes to prevent </script> attack
    '/': '\\/',
    '\\': '\\\\',
    '"': '\\"',
    '\b': '\\b',
    '\f': '\\f',
    '\n': '\\n',
    '\r': '\\r',
    '\t': '\\t',
}
  • 0
    Большое спасибо! Я буду использовать UltraJSON.
  • 0
    С удовольствием, Кей. Можно ли пометить мой ответ как решение, если он вам помог?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню