この記事は、私が過去 8 年間にわたってさまざまな SaaS 製品や Web サイトの運営について書いてきた一連の投稿の最初の記事です。 私がこれまで対処してきた問題、学んだ教訓、失敗、そしておそらくうまくいったことのいくつかを共有します。 教えてください あなたが思うこと!
2019 年か 2020 年に、私はバックエンド全体を書き直すことに決めていました。 送信者をブロックする、ユーザーがより優れたメール ブロックなどを作成できるようにする SaaS アプリケーションです。 その過程で、いくつかの新機能を追加し、より最新のテクノロジーにアップグレードしました。 テストを実行し、コードをデプロイし、実稼働環境ですべてを手動でテストしました。いくつかの偶然の結果を除けば、すべてがうまく機能しているように見えました。 これで話が終わればよかったのですが…。
数週間後、顧客から (それ自体恥ずかしいことですが) サービスが動作しておらず、受信トレイにブロックすべきメールが大量に届いているという通知を受けたため、調査しました。 多くの場合、この問題は Google がサービスからユーザーのアカウントへの接続を削除したことが原因で、システムはユーザーに電子メールで通知し、再接続を求めることで処理しますが、今回は別の原因でした。
ユーザー ブロックに対する電子メールのチェックを処理するバックエンド ワーカーが 5 ~ 10 分ごとにクラッシュし続けているようでした。 最も奇妙な部分は、ログにエラーはなく、メモリも正常でしたが、一見ランダムなタイミングで CPU の負荷が時折急上昇することがありました。 そのため、その後 24 時間 (3 時間の睡眠休憩を挟みます。お客様、申し訳ありません 😬) の間、ワーカーがクラッシュするたびに手動で再起動する必要がありました。 何らかの理由で、Elastic Beanstalk サービスの再起動の待機時間が長すぎるため、手動で再起動する必要がありました。
運用環境での問題をデバッグするのは常に面倒です。特に、問題の原因を特定することはおろか、ローカルで問題を再現することもできなかったのでです。 したがって、他の「優れた」開発者と同じように、私はログを記録し始めたところです すべてのもの そしてサーバーが再びクラッシュするのを待ちました。 CPU の負荷が定期的に急上昇していたので、これはマクロの問題 (メモリ不足の場合など) ではなく、おそらく特定の電子メールまたはユーザーが原因であると考えました。 そこで私はそれを絞り込んでみました:
- 特定の電子メール ID またはタイプでクラッシュしましたか?
- 特定の顧客でクラッシュが発生しましたか?
- 一定の間隔でクラッシュしていたのでしょうか?
これを何時間も続け、必要以上にログを見つめた結果、最終的には特定の顧客に絞り込むことができました。 そこから、検索範囲はかなり狭くなりました。おそらく、ブロック ルールか、サーバーが再試行し続けた特定の電子メールが原因でした。 幸いなことに、私にとっては前者でした。当社はプライバシーを非常に重視しており、電子メール データを保存したり表示したりしないことを考えると、デバッグがはるかに簡単な問題です。
正確な問題に入る前に、まず Block Sender の機能の XNUMX つについて話しましょう。 当時、同じパターンに従う特定の種類の電子メール アドレスをブロックできるワイルドカード ブロックを求める多くの顧客がありました。 たとえば、マーケティング電子メール アドレスからのすべての電子メールをブロックしたい場合は、ワイルドカードを使用できます。 marketing@*
そして、で始まるアドレスからのすべての電子メールをブロックします。 marketing@
.
私が考えなかったのは、誰もがワイルドカードの仕組みを理解しているわけではないということです。 私は、ほとんどの人が開発者としての私と同じ方法でそれらを使用すると想定していました。 *
任意の数の文字を表します。 残念ながら、この特定のユーザーは、次のコマンドを使用する必要があると想定していました。 一致させたい文字ごとに XNUMX つのワイルドカード。 彼らの場合、特定のドメインからのすべての電子メールをブロックしたいと考えていました (これは送信者ブロックのネイティブ機能ですが、彼らはそれに気づいていなかったのでしょう。それ自体が全体の問題です)。 したがって、使用する代わりに *@example.com
、彼らが使用した **********@example.com
.
POV: ユーザーがアプリを使用している様子を観察しています…
ワーカー サーバーでワイルドカードを処理するために、Node.js ライブラリを使用しています。 マッチャー、正規表現に変換することでグロブ マッチングに役立ちます。 このライブラリは次のようになります。 **********@example.com
次の正規表現のようなものに変換します。
/[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*@example.com/i
正規表現を使用した経験がある場合は、正規表現が、特に計算レベルで非常に急速に複雑になる可能性があることをご存知でしょう。 上記の式を適切な長さのテキストに一致させると、計算コストが非常に高くなり、最終的にワーカー サーバーの CPU を圧迫することになりました。 これが、サーバーが数分ごとにクラッシュする理由です。 複雑な正規表現を電子メール アドレスと照合しようとするとスタックしてしまう可能性があります。。 そのため、このユーザーが電子メールを受信するたびに、一時的な障害を処理するために組み込まれたすべての再試行に加えて、サーバーがクラッシュすることになります。
それで、これをどうやって修正したのでしょうか? 明らかに、簡単な解決策は、連続して複数のワイルドカードを含むすべてのブロックを見つけて修正することでした。 しかし、ユーザー入力をより適切にサニタイズする必要もありました。 どのユーザーも正規表現を入力してシステム全体をダウンさせることができます。 ReDoS攻撃.
ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!
この特定のケースの処理は非常に簡単で、連続するワイルドカード文字を削除します。
block = block.replace(/*+/g, '*')
しかし、それでもアプリは他の種類の ReDoS 攻撃に対して無防備なままになります。 幸いなことに、これらのタイプにも役立つパッケージ/ライブラリが多数あります。
上記の解決策と他の安全策を組み合わせて使用することで、この問題が再発するのを防ぐことができました。 ただし、ユーザー入力は決して信頼できないこと、アプリケーションで使用する前に必ずサニタイズする必要があることを思い出させてくれました。 私自身に起こるまで、これが潜在的な問題であることにさえ気づきませんでした。そのため、これが他の人が同じ問題を回避するのに役立つことを願っています。
ご質問、コメントがありますか、またはあなた自身のストーリーを共有したいですか? 連絡してください Twitter!
- SEO を活用したコンテンツと PR 配信。 今日増幅されます。
- PlatoData.Network 垂直生成 Ai。 自分自身に力を与えましょう。 こちらからアクセスしてください。
- プラトアイストリーム。 Web3 インテリジェンス。 知識増幅。 こちらからアクセスしてください。
- プラトンESG。 カーボン、 クリーンテック、 エネルギー、 環境、 太陽、 廃棄物管理。 こちらからアクセスしてください。
- プラトンヘルス。 バイオテクノロジーと臨床試験のインテリジェンス。 こちらからアクセスしてください。
- 情報源: https://stackabuse.com/behind-the-scenes-never-trust-user-input/
- :持っている
- :は
- :not
- $UP
- 1
- 20
- 2019
- 2020
- 24
- 8
- a
- できる
- 私たちについて
- 上記の.
- 実際に
- 追加されました
- 添加
- 住所
- アドレス
- 再び
- に対して
- すべて
- 許す
- 一人で
- また
- 常に
- 間で
- an
- および
- どれか
- アプリ
- 申し込み
- です
- 記事
- AS
- 質問
- 想定される
- At
- 攻撃
- 避ける
- 知って
- バックエンド
- BE
- 豆の茎
- になる
- き
- 背後に
- 舞台裏で
- さ
- より良いです
- ビット
- ブロック
- ブロッキング
- ブロック
- 国境
- ブレーク
- 内蔵
- 焙煎が極度に未発達や過発達のコーヒーにて、クロロゲン酸の味わいへの影響は強くなり、金属を思わせる味わいと乾いたマウスフィールを感じさせます。
- by
- 缶
- 取得することができます
- これ
- 場合
- 生じました
- 原因
- 一定
- 文字
- 文字
- 点検
- コード
- 組み合わせ
- 注釈
- 会社
- 複雑な
- 複雑な
- 計算的
- 接続
- 正しい
- 可能性
- できなかった
- CPU
- Crash
- クラッシュ
- 墜落
- 作ります
- 顧客
- Customers
- データ
- 決定しました
- 展開
- Developer
- DID
- しなかった
- do
- ドメイン
- ドン
- ダウン
- 原因
- 各
- 容易
- ほかに
- メール
- end
- 終わった
- 終了
- 入力します
- 全体
- エラー
- 特に
- さらに
- 最終的に
- あらゆる
- 誰も
- すべてのもの
- 例
- 高価な
- 体験
- 表現
- 障害
- かなり
- 遠く
- 特徴
- 特徴
- 少数の
- フィギュア
- 考え出した
- もう完成させ、ワークスペースに掲示しましたか?
- 終わり
- 名
- 修正する
- フォーカス
- 続いて
- フォロー中
- 前者
- から
- 取得する
- 受け
- GIF
- Gitの
- 与えられた
- 良い
- でログイン
- 素晴らしい
- ガイド
- 持っていました
- ハンドル
- ハンドル
- 実践的な
- が起こった
- 出来事
- 持ってる
- 助けます
- ことができます
- うまくいけば
- HOURS
- ホバー
- 認定条件
- HTTPS
- i
- ID
- if
- in
- 含まれました
- を取得する必要がある者
- に
- 問題
- 問題
- IT
- 自体
- ジョブ
- ただ
- 保管
- 知っている
- 姓
- 後で
- 学んだ
- 学習
- 長さ
- レッスン
- う
- レベル
- LG
- 図書館
- ような
- 可能性が高い
- ll
- 局部的に
- ロギング
- 長い
- より長いです
- 見
- たくさん
- 幸運にも
- マクロ
- 製
- 手動で
- 多くの
- マーケティング
- 一致
- マッチング
- 多分
- me
- メモリ
- 分
- ミス
- モダン
- 現代の技術
- 他には?
- 最も
- ずっと
- の試合に
- しなければなりません
- ネイティブ
- 必要とされる
- 決して
- 新作
- 新しい特徴
- 次の
- いいえ
- Node.js
- 通知する
- 数
- オッズ
- of
- on
- ONE
- 開いた
- or
- その他
- 私たちの
- でる
- 自分の
- 痛み
- 部
- 特定の
- パターン
- のワークプ
- プラトン
- プラトンデータインテリジェンス
- プラトデータ
- 投稿
- 潜在的な
- 実用的
- 防ぐ
- 多分
- 問題
- プロセス
- 生産
- 製品
- 質問
- クイック
- すぐに
- 非常に
- ランダム
- RE
- リーチ
- 実現
- 理由
- 合理的な
- 受け
- 再接続します
- レギュラー
- リマインダー
- 削除します
- 除去
- 表す
- 右
- リング
- ルール
- ラン
- ランニング
- s
- SaaSの
- 保障措置
- 同じ
- シーン
- を検索
- 見えた
- トランスミッタ
- シリーズ
- サービス
- Shadow
- シェアする
- シェアリング
- シート
- すべき
- 簡単な拡張で
- から
- 眠る
- So
- ソリューション
- 一部
- 誰か
- 何か
- スペース
- 特定の
- スパイク
- スタックアバス
- 規格
- 開始
- まだ
- Force Stop
- 店舗
- ストーリー
- T
- 取る
- Talk
- テクノロジー
- 一時的
- テスト
- テスト
- 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다.
- より
- それ
- アプリ環境に合わせて
- それら
- その後
- そこ。
- ボーマン
- 彼ら
- もの
- 物事
- 考える
- この
- 時間
- <font style="vertical-align: inherit;">回数</font>
- 〜へ
- あまりに
- 遷移
- 試み
- 信頼
- しよう
- 順番
- ターニング
- type
- 理解する
- 残念ながら
- まで
- アップグレード
- us
- つかいます
- 中古
- ユーザー
- users
- さまざまな
- Ve
- 非常に
- 、
- 詳しく見る
- 待っています
- 欲しいです
- wanted
- ました
- だった
- 見ている
- 仕方..
- we
- ウェブサイト
- ウィークス
- WELL
- went
- した
- この試験は
- いつ
- which
- 全体
- なぜ
- Wikipedia
- 仕事
- ワーカー
- ワーキング
- でしょう
- 書き込み
- 年
- 貴社
- あなたの
- ゼファーネット