json.dumps():转义正斜杠

时间:2014-11-25 14:45:41

标签: python json python-2.7 serialization escaping

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

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

可靠地工作,但它看起来很糟糕。

我知道正向斜线不必逃脱,但你可能逃脱它们,对于我的用例,我想要他们逃脱了。

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

根据ujson文档使用escape_forward_slashes

escape_forward_slashes 控制是否对正斜杠(/)进行转义。默认值为True:

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

请参见here