在HTTP请求中使用Celery任务ID是否安全?

时间:2016-08-25 09:27:54

标签: celery celery-task

我开始在基于Flask的Web应用程序中使用Celery在服务器端运行异步任务。

多个资源获取一个'/ action'子资源,用户/客户端可以向其发送POST,包括指定操作的JSON主体,例如:

curl -H "Content-Type: application/json" -X POST \
  -d '{"doPostprocessing": { "update": true}}}' \
  "http://localhost:5000/api/results/123/action"

他们收到带有标题的202 ACCEPTED回复

Location: http://localhost:5000/api/results/123/action/8c742418-4ade-474f-8c54-55deed09b9e5

他们可以轮询以获得最终结果(如果任务仍在运行,则可以获得另一个202 ACCEPTED。)

我为此操作返回的ID是celery.result.AsyncResult.id

这是安全的吗?将Celery任务ID直接传递给公众时,我会创建哪些问题?

如果没有,是否有推荐的方法呢?最好是避免必须明确跟踪任务状态的一个。

1 个答案:

答案 0 :(得分:1)

您可以使用任务ID。 Celery使用Kombu的uuid函数,默认情况下使用uuid4。 uuid4是随机生成的,而不是基于mac地址(uuid1是),因此将“足够随机”。

唯一的另一种方法是让API端点返回用户所有正在运行的任务的状态。即删除任何任务ID。但是,您将删除查询单个任务的功能。其他选项将有效地掩盖不同随机数背后的任务ID,因此您将遇到相同的暴力问题。

我建议您查看安全堆栈交换中的UUID问题(https://security.stackexchange.com/search?q=uuid)。其中一些无疑将等同于您正在寻找的东西。