如何禁止在celery中使用pickle序列化
Celery 默认使用 pickle 作为任务的序列化方法。正如在常见问题解答中提到的,这存在安全隐患。Celery 允许你通过 CELERY_TASK_SERIALIZER
这个配置参数来设置任务的序列化方式。
但是,这并不能解决安全问题。即使任务是用 JSON 或类似的格式进行序列化,工作进程仍然会执行那些用 pickle 序列化插入到队列中的任务——它们只是根据消息中的 content-type
参数来响应。因此,任何能够写入任务队列的人,都可以通过写入恶意的 pickle 对象来控制工作进程。
我该如何防止工作线程执行用 pickle 序列化的任务呢?
3 个回答
6
现在,Celery支持按应用程序进行配置,这样可以更简单地限制消费者可以执行的内容。
c = celery.Celery()
c.conf.update(CELERY_ACCEPT_CONTENT = ['json'])
想了解更多细节,可以查看Celery的安全文档,里面还有一些更高级的安全选项,比如内容签名。
63
我遇到了一个错误:“ContentDisallowed: 拒绝反序列化不可信的内容类型 pickle (application/x-python-serialize)”
当时我有:
CELERY_ACCEPT_CONTENT = ['json']
这还不够……我还需要在设置中添加以下内容:
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
10
我在celery-users邮件列表上得到了一个回答(具体来说是来自Ask Solem)。只需在配置文件(celeryconfig/settings)中添加这两行:
from kombu import serialization
serialization.registry._decoders.pop("application/x-python-serialize")