2014-11-25 1186 views
4

由于斜杠只能发生在一个JSON序列化对象的字符串内,并没有逃脱(默认设置),使用json.dumps():逃避斜线

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

可靠地工作,但它看起来哈克。

我知道,正斜杠不必是逃过一劫,但你可以逃脱他们,为我的用例,我希望让他们逃脱。

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

+0

为什么你需要逃避它们?什么用例需要转义?任何合理的JSON解码器都应该能够处理未转义的正斜杠。 – Kevin 2014-11-25 14:49:57

+0

在json中不需要转义正斜杠,所以没有理由期望json编码器支持斜线(或任何其他任意字符)。 – 2014-11-25 14:51:16

+0

'dumps('')=='“”''。我没有遇到任何问题,但我会睡得更好,如果'倾销('')=='“<\\/script>”''。 :-)我不会称正斜杠为“任意字符”。它是六个ASCII字符之一,它们有一个转义码,尽管你不必转义它们。 – kay 2014-11-25 14:59:38

回答

5

只有逃避斜线时encode_html_chars =真

退房这个 - https://github.com/esnme/ultrajson/pull/114

的JSON规范说向前slahes被隐式逃脱。

下面是在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', 
} 
+0

非常感谢!我将使用UltraJSON。 – kay 2014-11-25 15:06:48

+0

我很高兴凯。如果它对你有帮助,我的答案可以标记为解决方案吗? – bozzmob 2014-11-25 15:09:14