本文是我在过去 8 年中撰写的关于运行各种 SaaS 产品和网站的系列文章中的第一篇。 我将分享我处理过的一些问题、我学到的教训、我犯过的错误,也许还有一些正确的事情。 让我知道 你认为呢!
早在 2019 年或 2020 年,我就决定重写整个后端 阻止发件人,一款 SaaS 应用程序,可帮助用户创建更好的电子邮件块以及其他功能。 在此过程中,我添加了一些新功能并升级到更现代的技术。 我运行了测试,部署了代码,手动测试了生产中的所有内容,除了一些随机的零碎内容之外,一切似乎都运行良好。 我希望故事就这样结束,但是……
几周后,一位客户通知我(这本身就很尴尬),该服务无法正常工作,他们的收件箱中收到了大量应该被阻止的电子邮件,所以我进行了调查。 很多时候,这个问题是由于 Google 删除了我们的服务与用户帐户的连接,系统通过电子邮件通知用户并要求他们重新连接来处理该连接,但这次是其他原因。
看起来负责根据用户阻止检查电子邮件的后端工作人员每 5-10 分钟就会崩溃一次。 最奇怪的部分是——日志中没有错误,内存也很好,但 CPU 偶尔会在看似随机的时间出现峰值。 因此,在接下来的 24 小时内(中间有 3 小时的休息时间 – 对不起顾客😬),每次工作程序崩溃时,我都必须手动重新启动它。 由于某种原因,Elastic Beanstalk 服务等待重启的时间太长,这就是我必须手动执行此操作的原因。
在生产中调试问题总是很痛苦,特别是因为我无法在本地重现问题,更不用说找出导致问题的原因了。 所以像任何“优秀”开发人员一样,我刚刚开始记录 一切 并等待服务器再次崩溃。 由于 CPU 会定期出现峰值,我认为这不是宏观问题(例如内存不足时),可能是由特定电子邮件或用户引起的。 所以我试图缩小范围:
- 是否因特定电子邮件 ID 或类型而崩溃?
- 对于某个特定的客户来说,它是否崩溃了?
- 它是否每隔一段时间就崩溃一次?
经过几个小时的观察,我盯着日志的时间超出了我的意愿,最终,我确实将范围缩小到了特定的客户。 从那里开始,搜索空间缩小了很多——这很可能是一个阻止规则或我们的服务器不断重试的特定电子邮件。 对我来说幸运的是,这是前者,鉴于我们是一家非常注重隐私的公司并且不存储或查看任何电子邮件数据,这是一个更容易调试的问题。
在我们讨论具体问题之前,我们先来谈谈 Block Sender 的一个功能。 当时,我有许多客户要求进行通配符阻止,这将允许他们阻止遵循相同模式的某些类型的电子邮件地址。 例如,如果您想阻止来自营销电子邮件地址的所有电子邮件,您可以使用通配符 marketing@*
它会阻止来自任何以以下开头的地址的所有电子邮件 marketing@
.
我没有想到的一件事是,并不是每个人都了解通配符的工作原理。 我假设大多数人会像我作为开发人员一样使用它们,使用一个 *
来表示任意数量的字符。 不幸的是,这个特定的用户假设您需要使用 您想要匹配的每个字符都有一个通配符。 就他们而言,他们想要阻止来自某个域的所有电子邮件(这是 Block Sender 的本机功能,但他们一定没有意识到这一点,这本身就是一个完整的问题)。 所以不要使用 *@example.com
, 他们用 **********@example.com
.
POV:观察您的用户使用您的应用程序......
为了处理工作服务器上的通配符,我们使用 Node.js 库 匹配器,它通过将其转换为正则表达式来帮助进行全局匹配。 然后这个图书馆就会变成 **********@example.com
类似于以下正则表达式:
/[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*@example.com/i
如果您有使用正则表达式的经验,您就会知道它们很快就会变得非常复杂,尤其是在计算级别上。 将上述表达式与任何合理长度的文本进行匹配会导致计算成本非常高,最终会占用我们工作服务器上的 CPU。 这就是为什么服务器每隔几分钟就会崩溃; 尝试将复杂的正则表达式与电子邮件地址匹配时会遇到困难。 因此,每次该用户收到电子邮件时,除了我们内置的用于处理临时故障的所有重试之外,它还会使我们的服务器崩溃。
那么我是如何解决这个问题的呢? 显然,快速解决办法是连续找到所有带有多个通配符的块并纠正它们。 但我还需要更好地清理用户输入。 任何用户都可以输入正则表达式并使用以下命令关闭整个系统 重拒绝攻击.
查看我们的 Git 学习实践指南,其中包含最佳实践、行业认可的标准以及随附的备忘单。 停止谷歌搜索 Git 命令,实际上 学习 它!
处理这种特殊情况相当简单——删除连续的通配符:
block = block.replace(/*+/g, '*')
但这仍然使该应用程序容易受到其他类型的 ReDoS 攻击。 幸运的是,还有许多包/库可以帮助我们处理这些类型:
结合使用上述解决方案和其他保护措施,我已经能够防止这种情况再次发生。 但这是一个很好的提醒,您永远不能相信用户输入,并且在应用程序中使用它之前您应该始终对其进行清理。 我什至没有意识到这是一个潜在的问题,直到它发生在我身上,所以希望这可以帮助其他人避免同样的问题。
有任何问题、意见或想分享您自己的故事吗? 联系 Twitter!
- :具有
- :是
- :不是
- $UP
- 1
- 20
- 2019
- 2020
- 24
- 8
- a
- Able
- 关于
- 以上
- 账号管理
- 通
- 添加
- 增加
- 地址
- 地址
- 再次
- 驳
- 所有类型
- 让
- 单
- 还
- 时刻
- 其中
- an
- 和
- 任何
- 应用
- 应用领域
- 保健
- 刊文
- AS
- 问
- 假定
- At
- 攻击
- 避免
- 察觉
- 后端
- BE
- 魔豆
- 成为
- 很
- before
- 背后
- 在幕后
- 作为
- 更好
- 位
- 阻止
- 闭塞
- 吹氣梢
- 边界
- 午休
- 建
- 但是
- by
- CAN
- 可以得到
- 关心
- 案件
- 造成
- 造成
- 一定
- 字符
- 字符
- 检查
- 码
- 组合
- 注释
- 公司
- 复杂
- 复杂
- 计算
- 地都
- 正确
- 可以
- 不能
- 崩溃
- 失事
- 崩溃
- 创建信息图
- 顾客
- 合作伙伴
- data
- 处理
- 决定
- 部署
- 开发商
- DID
- 没
- do
- 域
- 不
- 向下
- 两
- 每
- 更容易
- 其他
- 邮箱地址
- 电子邮件
- 结束
- 截至
- 结束
- 输入
- 整个
- 故障
- 特别
- 甚至
- 终于
- 所有的
- 每个人
- 一切
- 例子
- 昂贵
- 体验
- 表达
- 失败
- 相当
- 远
- 专栏
- 特征
- 少数
- 数字
- 想通
- 找到最适合您的地方
- 结束
- 姓氏:
- 固定
- 专注焦点
- 其次
- 以下
- 针对
- 前
- 止
- 得到
- 越来越
- GIF
- 混帐
- 特定
- 非常好
- 谷歌
- 大
- 指南
- 民政事务总署
- 处理
- 手柄
- 动手
- 发生
- 事件
- 有
- 帮助
- 帮助
- 希望
- HOURS
- 徘徊
- 创新中心
- HTTPS
- i
- ID
- if
- in
- 包括
- 输入
- 代替
- 成
- 问题
- 问题
- IT
- 本身
- 工作
- 只是
- 不停
- 知道
- 名:
- 后来
- 知道
- 学习
- 长度
- 教训
- 让
- Level
- LG
- 自学资料库
- 喜欢
- 容易
- ll
- 当地
- 记录
- 长
- 不再
- 看着
- 很多
- 宏
- 制成
- 手动
- 许多
- 营销
- 匹配
- 匹配
- 也许
- me
- 内存
- 分钟
- 错误
- 现代
- 现代技术
- 更多
- 最先进的
- 许多
- 多
- 必须
- 狭窄
- 本地人
- 打印车票
- 决不要
- 全新
- 新功能
- 下页
- 没有
- 节点
- Node.js的
- 通知
- 数
- 可能性
- of
- on
- 一
- 打开
- or
- 其他名称
- 我们的
- 输出
- 己
- 面包
- 部分
- 特别
- 模式
- 员工
- 柏拉图
- 柏拉图数据智能
- 柏拉图数据
- 帖子
- 潜力
- 实用
- 防止
- 大概
- 市场问题
- 过程
- 生产
- 热销产品
- 有疑问吗?
- 快速
- 很快
- 相当
- 随机
- RE
- 达到
- 实现
- 原因
- 合理
- 收到
- 重新连接
- 正则表达式
- 定期
- 提醒
- 去掉
- 删除
- 代表
- 右
- 戒指
- 第
- 运行
- 运行
- s
- SaaS的
- 保障
- 同
- 场景
- 搜索
- 似乎
- 似乎
- 寄件人
- 系列
- 服务器
- 服务
- 阴影
- Share
- 共享
- 片
- 应该
- 简易
- 自
- 睡觉
- So
- 解决方案
- 一些
- 有人
- 东西
- 太空
- 具体的
- 穗
- 堆栈滥用
- 标准
- 开始
- 仍
- Stop 停止
- 商店
- 故事
- 系统
- 采取
- 谈论
- 技术
- 临时
- 测试
- 测试
- 文本
- 比
- 这
- 其
- 他们
- 然后
- 那里。
- 博曼
- 他们
- 事
- 事
- 认为
- Free Introduction
- 次
- 时
- 至
- 也有
- 过渡
- 尝试
- 信任
- 试图
- 转
- 谈到
- 类型
- 类型
- 理解
- 不幸
- 直到
- 升级
- us
- 使用
- 用过的
- 用户
- 用户
- 运用
- 各个
- Ve
- 非常
- 通过
- 查看
- 等候
- 想
- 通缉
- 是
- 不是
- 观看
- 方法..
- we
- 网站
- 周
- 井
- 去
- 为
- 什么是
- ,尤其是
- 这
- 全
- 为什么
- 维基百科上的数据
- 希望
- 工作
- 工人
- 加工
- 将
- 写作
- 年
- 完全
- 您一站式解决方案
- 和风网