不完整的日程表会在不显示任何错误的情况下静默地禁用日程安排
作者: lkraider创建于 2026年8月3日更新于 2026年8月3日
□ 总结
`Q.outdated queries ()' ('redash/models/ init .py')可以默默地设置查询''时间表'. 禁用=True = 当“ 排程” JSON 格式不正确时, 任何地方( API 响应、 UI 、 Org 管理员可见的日志) 都显示出问题。 唯一的症状是迟到的查询结果很僵硬,很晚才发现.
□ 根源
‘时刻表'一栏在写作上没有服务器侧形状验证——'POST /api/queries/{id} 与"时刻表":{...}接受并回應所发送的JSON,甚至像"中间"这样的部分对象:86400}.
但排程器的过时的 queries ()'读取的排程是直接的dict索引,而不是.get ()':
如果查询。 排程["直到"] :
. . . . . . . .
如果下个排程( N)
现在检索到
查询. schedule["interval"],
查询. 排程["时间"],
查询. exchedule ["day of week"],
查询. schedule failures,
:和“ ext( ) should exchedule next() ” 以严格的无包装方式描述 :
[Python] 小时,分数=分数. split (":").
因此,在保存一个不完整的时间表(漏出`至'/`时间'/`天'周一日')之后,或者在“时间”包括秒(`07:00'而不是`07:00')之后,在下一个排程器上划出一个“关键位置”或“ValueError”。 这一例外被`过时的 queries()'中的 " 除例外 " :
```2ZZ
例外作为e:
查询. chedule ["disabled"] = true
db.session.commit () (中文(简体) ).
消息 = (“无法确定查询%d是否由于 %s 已经过时。”
"本次查询的时间表已禁用"% (query.id, repr(e))
look.info( 消息)
岗哨. capture 例外(.)这仅仅是`logb.info' + “哨兵”(如果配置的话)——没有任何信息通过查询API、仪表板或任何显示用户的表面暴露出来。 较早前看起来很好的时间表悄悄地翻转到“残疾:真实”的排行符中(~一分钟),并一直这样,直到有人发现数据有问题,手动重新检查时间表JSON。
□ 影响
任何人通过API(而不是完全通过UI,它总是发送完整的外形)来驾驶,都可以在不意识到的情况下绊倒它——我们通过9个独立的查询,输入了两个出品仪表板,由于修复本身重写了一个不完整的表列对象,在初始"固定"后会再现.
□ 建议的修补(任何修补都会有所帮助)
- 在
POST/api/queries/{id}>上验证 " 时间表 " 形状,并拒绝/规范不完整或畸形的物体,而不是默默接受,或 - 使用
.get()',在过时 queries()' /`should chedule next()'中默认,而不是直接编制索引,因此部分时间表只是有正常的默认,而不是崩溃,或 - 至少,在可见的地方表面显示自动失效,例如,在
GET /api/queries/{id}-答复中包括`chedule funures'式信息,或仪表板/query-list徽章——因此它并非纯粹是服务器日志行。
□ 版本( O)
与Redash一案发生 . . . . . . .
内容来源: getredash/redash