对象的安全JSON转换

时间:2015-03-27 09:17:06

标签: python json escaping inject

jsonsimplejson都支持json.JSONEncoder的扩展,目的是序列化非基础对象。但是,从文档中我无法理解如何安全地执行此操作。

这是我的编码器:

class ReprEncoder(json.JSONEncoder):

    @staticmethod
    def of(*types):
        return ft.partial(ReprEncoder, types)

    def __init__(self, repr_types, **kwargs):
        self.__repr_types = repr_types
        super(ReprEncoder, self).__init__(**kwargs)

    def default(self, obj):
        if type(obj) in self.__repr_types:
            return 'r[%r]' % obj
        return super(ReprEncoder, self).default(obj)

of方法允许我提供支持序列化的类,并使用约定r[%r]表示此类对象。在反序列化方面,如果匹配r[ ... ],我计划使用这样的策略,然后使用某些(可能是安全的!)eval反序列化技术

假设对于某些课程CC.__repr__有效as expected我可以按照以下方式调用它:

c = C('foo', 'bar', 3)
json.dumps(c, cls=ReprEncoder.of(C))

从文档中我们不清楚如何转义意外匹配我的语义的字符串。这个想法是:如果要编码的字符串与r[ ... ]语法匹配,那么预先挂起反斜杠 + 在反序列化时,向后看r用于反斜杠

这样的伎俩:

def default(self, obj):
    # ...
    if type(obj) in types.StringTypes and obj.startswith('r'):
        obj = '\\' + obj
    return super(ReprEncoder, self).default(obj)

不起作用,因为仅当默认编码器没有关于如何解码数据的线索时才调用default方法。此外,json.JSONEncode没有实现string(或类似)之类的内容,我可以覆盖。

任何提示?

0 个答案:

没有答案