如何禁止在celery中使用pickle序列化

42 投票
3 回答
15439 浏览
提问于 2025-04-16 21:07

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")

撰写回答