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

Is it safe to use Celery task IDs in HTTP requests?

我开始在 Flask-based 网络应用程序中使用 Celery 来 运行 服务器端的异步任务。

一些资源获得一个“/action”sub-resource,user/client 可以向其发送一个 POST,包括一个 JSON-body 指定一个动作,例如:

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

他们收到 202 ACCEPTED 的回复 header

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

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

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

这样做安全吗?将 Celery 任务 ID 直接传递给 public 时会产生什么样的问题?

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

您可以使用任务 ID。 Celery 使用 Kombu 的 uuid 函数,它默认使用 uuid4。 uuid4 是随机生成的,而不是基于 mac 地址(uuid1 是),因此将是 'random enough'.

唯一的其他方法是拥有一个 API 端点,该端点 returns 用户所有 运行 任务的状态。即删除任何任务 ID。但是您随后将删除查询单个任务的能力。其他选项将有效地掩盖不同随机数后面的任务 ID,因此您将遇到同样的暴力破解问题。

我建议通过安全堆栈交换查看 UUID 问题 (https://security.stackexchange.com/search?q=uuid)。其中一些无疑与您正在寻找的内容相同。