python - Celery 拒绝反序列化我的自定义序列化内容并抛出 ContentDisallowed Exception

标签 python serialization openssl celery

我一直在使用 celery 和 rabbitmq 作为我的后端队列来管理我的任务。 有些对象包含无法使用 json 序列化的日期时间属性,因此我选择使用 pickle 作为序列化程序。

与安全相关的问题,它报告不受信任的内容无法反序列化。 通过此链接后 http://celery.readthedocs.org/en/latest/userguide/security.html#guide-security 我已经使用 openssl 生成了私钥和关联的自签名证书,并相应地配置了身份验证设置。 这次我看到的错误是 ExpiredCerticate,我没有找到任何相关文档。

所以我编写了如下自定义序列化器,之后它抛出了与 pickle saying 相同类型的错误

import json
from datetime import datetime
from time import mktime

class DateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return {
                '__type__': '__datetime__',
                'epoch': int(mktime(obj.timetuple()))
            }
        else:
            return json.JSONEncoder.default(self, obj)

def datetime_decoder(obj):
    if '__type__' in obj:
        if obj['__type__'] == '__datetime__':
            return datetime.fromtimestamp(obj['epoch'])
    return obj

# Encoder function                                                                                                                                                                                               
def datetime_dumps(obj):
    return json.dumps(obj, cls=DateTimeEncoder)

# Decoder function                                                                                                                                                                                               
def datetime_loads(obj):
    return json.loads(obj, object_hook=datetime_decoder)

ContentDisallowed:拒绝反序列化序列化程序类型(application/x-serializer)的不受信任的内容

有人可以指导我如何进行吗?感谢您的帮助。

提前致谢!

最佳答案

上面的问题没有确切的解决方案,但您可以通过以下解决方法。 默认情况下,在 kombu 序列化文件 (serialization.py) 中调用一个禁用所有可用序列化程序的函数(包括 pickle)

from kombu.serialization import registry
registry.enable('pickle')

它将启用 pickle 序列化程序,而不管内容是可信的还是不可信的。 当然这是一个黑客。希望对你有帮助!

关于python - Celery 拒绝反序列化我的自定义序列化内容并抛出 ContentDisallowed Exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27579736/

相关文章:

c - 如何在C中使用openssl从私钥中提取公钥

java - java和c#中的序列化集成解决方案?

java - 如何在 protobuf 消息中添加一个 int 数组

python - “模块”对象没有属性 'pcapObject'

python - mysql读取->处理->更新,针对大数据进行优化

java - 在Java中,如何创建等效的Apache Avro容器文件而又不被迫使用File作为媒介?

openssl - OpenSSL 的内部客户端 session 缓存的目的是什么?

windows - 用于 64 位 Windows 和 "no shared cipher"的 OpenSSL

python - 从 VBA 调用 Python 脚本 - 不起作用

python - 安装 Python 时出错