2014-11-25 281 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