有没有简单高效可靠的方法防止 web 服务半夜定时执行的耗时任务被恶意执行?

2 天前
 shendaowu

我要求是不是太多了?如果属于不可能三角的话可以去掉高效。反正本来就是很耗时的任务,除非会大幅影响其他页面的延迟之类的。

耗时任务是一些数据库查询,还有数据库备份,可能还会有别的。每天每种只执行一次。

我目前计划用 cron 定时访问 web 服务的一个地址。后端语言是 Go 。Go 有个很多人用的第三方的 cron 库,但是五年没更了,看 issue 好像也不是没问题,不敢用。

我问 deepseek 它说验证源 IP 是不是 127.0.0.1 、::1 、localhost 就行了。另外需要注意一些特殊情况。比如代理、负载均衡器和容器。这个有漏洞吗?还要不要在耗时任务执行之前加个时段判断和今天是否已经执行过了?还有当前是否正在执行耗时任务。cron 好像在特殊情况下会重复执行?比如修改系统时间。

主要需求就是防止这个东西成为被攻击的点。

2746 次点击
所在节点    信息安全
34 条回复
ggzhyipeng
2 天前
robfig/cron 我们生产用挺久了,没啥问题吧。
实在要用外部 cron 的话,接口限制只能从内网/127 调用,或者改成命令行调用
edward1987
2 天前
执行前加个锁呗,就算被多次调用也不怕
zjyl1994
2 天前
robfig/cron 没什么问题,程序里直接调用肯定是最安全的。
如果非要通过 http 进行触发,可以加个 token 验证。

至于被人进到服务器里面改时间反复触发 cron ,很难解决的。还是要做好防护把安全问题拦在外面。
juzisang
2 天前
加个 token 校验或者随机字符的 url 不就行了,就是个普普通通的 webhook 需求...
sthwrong
2 天前
触发多次的问题可以上锁,同一个任务只有一个实例在执行。接口鉴权和高频请求都好处理。至于系统时间修改,都能改时间了估计也能删你库了,那没啥了。
way2create
2 天前
不知道在讲什么,你定义的恶意执行是什么呢?不如举几个实际场景吧,不要虚空索敌。
sagnitude
2 天前
1. 管理接口也对互联网开放并且不加任何认证措施?
2. 为什么不另起一个服务或者 docker 去做耗时的任务?放在生产服务器上跑这种任务是严重影响使用的,万一跑到早上呢,万一出错把线程池占满了,早上起来所有客户都 boom 了呢
3. 就好比用 spring 的定时执行就可以做到的事情,不应当暴露一个接口出来,其他语言也肯定有类似的功能
4. 内网找另一台机器用 crontab 启动/停止一个单独的程序,执行完就关掉是最好的
momocraft
2 天前
单独二进制(或者进程入口)挺好的
不要用 http 触发
oneisall8955
2 天前
加参数校验
realpg
2 天前
你连个鉴权都不会写吗?
ruanimal
2 天前
@sduoduo233 复用二进制文件,加个参数就行了啊
yinmin
2 天前
类似 openai 的 api 认证 key ,每次 web api 调用时都验证 http request header

Authorization: Bearer YOUR_API_KEY

然后客户端请求的时候加上 YOUR_API_KEY 访问你的 web api
litchinn
2 天前
首先考虑这个定时任务是不是非得以 http 接口的形式调用 否:用应用内部调度器实现
这个 http 接口是否必须暴露到外网 是:添加白名单或者认证机制 否:禁止外网的直接访问
重复执行的问题,如果已经有能修改你的系统时间的权限了,那应该没法避免,重复执行些任务已经是轻的了
你应该要重点考虑的是这个“耗时任务”会不会影响系统正常功能,能不能限制它使用的资源
momocraft
2 天前
如果需要理论依据:这类负载类似于 12 factor app 里的这个: https://www.12factor.net/admin-processes
建议做法是从同一套代码构建,但是和 web server 分开执行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1158678

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX