【问题标题】:json.dumps(): escaping forward slashesjson.dumps():转义正斜杠
【发布时间】:2015-01-23 15:09:41
【问题描述】:

由于正斜杠只能出现在 JSON 序列化对象内的字符串中并且不会转义(在默认设置中),因此使用

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

可靠地工作,但它看起来很老套。

我知道正斜杠不必转义,但您可以转义它们,对于我的用例,我想让它们转义。

有没有办法让 JSONEncoder 在不手动转义的情况下转义正斜杠?

【问题讨论】:

  • 为什么要逃避它们?什么用例需要转义?任何合理的 JSON 解码器都应该能够处理未转义的正斜杠。
  • 在 json 中不需要转义正斜杠,因此没有理由期望 json 编码器支持转义斜杠(或任何其他任意字符)。
  • dumps('</script>') == '"</script>"'。我没有遇到任何问题,但如果dumps('</script>') == '"<\\/script>"' 我会睡得更好。 :-) 我不会将正斜杠称为“任意字符”。它是具有转义码的六个 ASCII 字符之一,尽管您不必对其进行转义。

标签: python json python-2.7 serialization escaping


【解决方案1】:

仅在 encode_html_chars=True 时转义正斜杠

看看这个—— https://github.com/esnme/ultrajson/pull/114

JSON 规范规定正斜杠应被隐式转义。

这是在 JSONEncoder 本身中执行此操作的解决方案。只是你创建一个 ESCAPE DICTIONARY 并在手前进行计算,然后再进行编码。

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',
}

【讨论】:

  • 非常感谢!我将使用 UltraJSON。
  • 我很高兴凯。如果我的回答对您有所帮助,是否可以将其标记为解决方案?
【解决方案2】:

按照 ujson 文档使用 escape_forward_slashes

escape_forward_slashes 控制是否转义正斜杠 (/)。默认为真:

>>> ujson.dumps("http://esn.me")
'"http:\/\/esn.me"'
>>> ujson.dumps("http://esn.me", escape_forward_slashes=False)
'"http://esn.me"'

here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多