如何在芹菜中禁止pickle序列化



芹菜默认使用pickle作为任务的序列化方法。如FAQ中所述,这代表了一个安全漏洞。芹菜允许您使用CELERY_TASK_SERIALIZER配置参数配置任务的序列化方式。

但这并不能解决安全问题。即使任务是用JSON或类似的方式序列化的,工作线程仍然会执行用pickle序列化插入到队列中的任务——它们只是响应消息中的content-type参数。因此,任何可以写入任务队列的人都可以通过写入恶意pickle对象来有效地控制工作进程。

如何防止工作线程运行用pickle序列化的任务?

我得到"ContentDisallowed:拒绝反序列化类型为pickle的不受信任的内容(application/x-python-serialize)"

:

CELERY_ACCEPT_CONTENT = ['json']

是不够的…我还必须在设置中添加以下内容:

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

我从celry用户邮件列表(具体来说是Ask Solem)得到了一个答案。将这两行添加到配置(celeryconfig/settings):

from kombu import serialization
serialization.registry._decoders.pop("application/x-python-serialize")

既然芹菜支持基于每个应用的配置,那么就有了一种更清晰的方式来限制消费者将执行的内容。

c = celery.Celery()
c.conf.update(CELERY_ACCEPT_CONTENT = ['json'])

请参阅芹菜文档中的安全详细信息,以及更高级的安全选项,如对内容进行签名。

相关内容

  • 没有找到相关文章

最新更新