این مقاله اولین مقاله از مجموعه پست هایی است که در مورد اجرای محصولات و وب سایت های مختلف SaaS در 8 سال گذشته می نویسم. برخی از مسائلی را که با آنها برخورد کردهام، درسهایی که آموختهام، اشتباهاتی که مرتکب شدهام و شاید چند مورد که درست پیش رفتهاند را به اشتراک میگذارم. خبرم کن آنچه شما فکر می کنید!
در سال 2019 یا 2020، تصمیم گرفتم کل باطن را برای آن بازنویسی کنم مسدود کردن فرستنده، یک برنامه SaaS که به کاربران کمک می کند تا بلوک های ایمیل بهتری را از جمله ویژگی های دیگر ایجاد کنند. در این فرآیند، چند ویژگی جدید اضافه کردم و به فناوریهای بسیار مدرنتری ارتقا دادم. من تست ها را اجرا کردم، کد را اجرا کردم، همه چیز را به صورت دستی در تولید آزمایش کردم، و به غیر از چند شانس و پایان تصادفی، همه چیز عالی به نظر می رسید. کاش این پایان داستان بود اما…
چند هفته بعد، یک مشتری به من اطلاع داد (که به خودی خود شرم آور است) که سرویس کار نمی کند و آنها ایمیل های زیادی را که باید مسدود شوند در صندوق ورودی خود دریافت می کنند، بنابراین من تحقیق کردم. بسیاری از اوقات این مشکل به دلیل حذف اتصال از سرویس ما به حساب کاربر توسط گوگل است که سیستم با اطلاع دادن به کاربر از طریق ایمیل و درخواست اتصال مجدد از او انجام می دهد، اما این بار چیز دیگری بود.
به نظر میرسید که کارگر پشتیبان که چک کردن ایمیلها در برابر بلوکهای کاربر را کنترل میکند، هر 5 تا 10 دقیقه یکبار خراب میشود. عجیب ترین بخش - هیچ خطایی در گزارش ها وجود نداشت، حافظه خوب بود، اما CPU گاهی اوقات در زمان های به ظاهر تصادفی افزایش می یابد. بنابراین برای 24 ساعت آینده (با یک استراحت 3 ساعته برای خواب - متاسفم از مشتریان 😬)، مجبور شدم هر بار که کارگر خراب می شود، به صورت دستی راه اندازی مجدد کنم. به دلایلی، سرویس Elastic Beanstalk برای راه اندازی مجدد خیلی طولانی منتظر بود، به همین دلیل مجبور شدم این کار را به صورت دستی انجام دهم.
اشکال زدایی مشکلات در تولید همیشه دردسرساز است، به خصوص از آنجایی که من نمی توانستم موضوع را به صورت محلی بازتولید کنم، چه رسد به اینکه بفهمم چه چیزی باعث آن شده است. بنابراین مانند هر توسعه دهنده "خوب"، من تازه شروع به ورود به سیستم کردم همه چیز و منتظر ماند تا سرور دوباره خراب شود. از آنجایی که CPU به صورت دورهای افزایش مییابد، متوجه شدم که این یک مشکل ماکرو نیست (مثل زمانی که حافظه شما تمام میشود) و احتمالاً توسط یک ایمیل یا کاربر خاص ایجاد شده است. بنابراین سعی کردم آن را محدود کنم:
- آیا روی شناسه یا نوع ایمیل خاصی خراب می شد؟
- آیا برای یک مشتری معین خراب بود؟
- آیا در فواصل زمانی منظمی خراب می شد؟
بعد از ساعتها از این کار، و خیره شدن به سیاههها بیشتر از آنچه که دوست داشتم، در نهایت، آن را به یک مشتری خاص محدود کردم. از آنجا، فضای جستجو تا حدی محدود شد - به احتمال زیاد این یک قانون مسدود کردن یا ایمیل خاصی بود که سرور ما مدام روی آن تلاش می کرد. خوشبختانه برای من، این مورد اول بود، که با توجه به اینکه ما یک شرکت بسیار متمرکز بر حریم خصوصی هستیم و هیچ داده ایمیلی را ذخیره یا مشاهده نمی کنیم، مشکلی بسیار ساده تر برای رفع اشکال است.
قبل از اینکه به مشکل دقیق بپردازیم، ابتدا در مورد یکی از ویژگی های Block Sender صحبت می کنیم. در آن زمان، من مشتریان زیادی داشتم که درخواست مسدود کردن علامتهای عام را میدادند، که به آنها اجازه میداد تا انواع خاصی از آدرسهای ایمیل را که از الگوی مشابهی پیروی میکردند، مسدود کنند. برای مثال، اگر میخواهید همه ایمیلها را از آدرسهای ایمیل بازاریابی مسدود کنید، میتوانید از علامت عام استفاده کنید marketing@*
و تمام ایمیلها را از هر آدرسی که با آن شروع شده بود مسدود میکرد marketing@
.
چیزی که من به آن فکر نکردم این است که همه نمیدانند وایلدکارتها چگونه کار میکنند. من فرض کردم که اکثر مردم از آنها به همان روشی که من به عنوان یک توسعه دهنده استفاده می کنم، استفاده می کنند *
برای نمایش هر تعداد کاراکتر متأسفانه، این کاربر خاص فرض کرده بود که شما باید استفاده کنید برای هر شخصیتی که می خواهید مطابقت داشته باشید، یک علامت عام وجود دارد. در مورد آنها، آنها می خواستند همه ایمیل های یک دامنه خاص را مسدود کنند (که یک ویژگی بومی Block Sender است، اما آنها باید متوجه آن نشده باشند، که خود یک مشکل کامل است). بنابراین به جای استفاده از *@example.com
، آنها استفاده کردند **********@example.com
.
POV: تماشای استفاده کاربران از برنامه شما…
برای مدیریت حروف عام در سرور کارگر خود، از کتابخانه Node.js استفاده می کنیم کبریت، که با تبدیل آن به یک عبارت منظم به تطبیق glob کمک می کند. این کتابخانه سپس تبدیل می شود **********@example.com
به چیزی شبیه به regex زیر:
/[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*@example.com/i
اگر تجربهای با regex دارید، میدانید که آنها میتوانند خیلی سریع پیچیده شوند، مخصوصاً در سطح محاسباتی. تطبیق عبارت فوق با هر طول متن معقولی از نظر محاسباتی بسیار گران می شود، که در نهایت منجر به گره خوردن CPU در سرور کارگر ما شد. به همین دلیل است که سرور هر چند دقیقه یکبار از کار می افتد. در تلاش برای تطبیق یک عبارت منظم پیچیده با یک آدرس ایمیل گیر می کند. بنابراین هر بار که این کاربر ایمیلی دریافت میکند، علاوه بر تمام تلاشهای مجددی که برای رسیدگی به خرابیهای موقتی ایجاد کردهایم، سرور ما را از کار میاندازد.
پس چگونه این را رفع کردم؟ بدیهی است که راه حل سریع این بود که همه بلوکها را با چندین علامت عام بهطور متوالی پیدا کنید و آنها را اصلاح کنید. اما من همچنین باید کار بهتری برای پاکسازی ورودی کاربر انجام دهم. هر کاربری میتواند یک regex را وارد کرده و کل سیستم را با a حذف کند حمله ReDoS.
راهنمای عملی و عملی ما برای یادگیری Git را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!
رسیدگی به این مورد خاص نسبتاً ساده بود - کاراکترهای متوالی را حذف کنید:
block = block.replace(/*+/g, '*')
اما این همچنان برنامه را برای انواع دیگر حملات ReDoS باز می کند. خوشبختانه تعدادی بسته/کتابخانه برای کمک به ما در مورد این انواع نیز وجود دارد:
با استفاده از ترکیبی از راه حل های بالا و سایر اقدامات حفاظتی، من توانستم از تکرار این اتفاق جلوگیری کنم. اما یادآوری خوبی بود که هرگز نمی توانید به ورودی کاربر اعتماد کنید و همیشه باید قبل از استفاده از آن در برنامه خود آن را ضدعفونی کنید. من حتی نمیدانستم که این یک مشکل بالقوه است تا زمانی که برای من اتفاق افتاد، بنابراین امیدوارم، این به شخص دیگری کمک کند تا از همان مشکل جلوگیری کند.
آیا هر گونه سوال، نظر یا می خواهید داستانی از خودتان به اشتراک بگذارید؟ دست دراز کنید توییتر!
- محتوای مبتنی بر SEO و توزیع روابط عمومی. امروز تقویت شوید.
- PlatoData.Network Vertical Generative Ai. به خودت قدرت بده دسترسی به اینجا.
- PlatoAiStream. هوش وب 3 دانش تقویت شده دسترسی به اینجا.
- PlatoESG. کربن ، CleanTech، انرژی، محیط، خورشیدی، مدیریت پسماند دسترسی به اینجا.
- PlatoHealth. هوش بیوتکنولوژی و آزمایشات بالینی. دسترسی به اینجا.
- منبع: https://stackabuse.com/behind-the-scenes-never-trust-user-input/
- : دارد
- :است
- :نه
- $UP
- 1
- 20
- 2019
- 2020
- 24
- 8
- a
- قادر
- درباره ما
- بالاتر
- حساب
- واقعا
- اضافه
- اضافه
- نشانی
- آدرس
- از نو
- در برابر
- معرفی
- اجازه دادن
- تنها
- همچنین
- همیشه
- در میان
- an
- و
- هر
- نرم افزار
- کاربرد
- هستند
- مقاله
- AS
- خواهان
- فرض
- At
- حمله
- اجتناب از
- مطلع
- بخش مدیریت
- BE
- لوبیای سحرآمیز
- شود
- بوده
- قبل از
- پشت سر
- پشت صحنه
- بودن
- بهتر
- بیت
- مسدود کردن
- انسداد
- بلاک ها
- مرز
- شکستن
- ساخته
- اما
- by
- CAN
- می توانید دریافت کنید
- اهميت دادن
- مورد
- ایجاد می شود
- باعث می شود
- معین
- شخصیت
- کاراکتر
- بررسی
- رمز
- ترکیب
- نظرات
- شرکت
- پیچیده
- بغرنج
- محاسباتی
- ارتباط
- اصلاح
- میتوانست
- توانست
- سقوط
- سقوط کرد
- سقوط
- ایجاد
- مشتری
- مشتریان
- داده ها
- رسیدگی کرد
- مصمم
- مستقر
- توسعه دهنده
- DID
- نشد
- do
- دامنه
- دان
- پایین
- دو
- هر
- آسان تر
- دیگر
- پست الکترونیک
- ایمیل
- پایان
- به پایان رسید
- به پایان می رسد
- وارد
- تمام
- خطاهای
- به خصوص
- حتی
- در نهایت
- هر
- هر کس
- همه چیز
- مثال
- گران
- تجربه
- بیان
- شکست
- منصفانه
- بسیار
- ویژگی
- امکانات
- کمی از
- شکل
- شکل گرفت
- پیدا کردن
- پایان
- نام خانوادگی
- رفع
- تمرکز
- به دنبال
- پیروی
- برای
- سابق
- از جانب
- دریافت کنید
- گرفتن
- GIF
- رفتن
- داده
- خوب
- گوگل
- بزرگ
- راهنمایی
- بود
- دسته
- دستگیره
- دست
- اتفاق افتاده است
- اتفاق می افتد
- آیا
- کمک
- کمک می کند
- خوشبختانه
- ساعت ها
- در تردید بودن
- چگونه
- HTTPS
- i
- ID
- if
- in
- مشمول
- ورودی
- در عوض
- به
- موضوع
- مسائل
- IT
- خود
- کار
- تنها
- نگه داشته شد
- دانستن
- نام
- بعد
- آموخته
- یادگیری
- طول
- درس
- اجازه
- سطح
- LG
- کتابخانه
- پسندیدن
- احتمالا
- ll
- به صورت محلی
- ورود به سیستم
- طولانی
- دیگر
- نگاه
- مقدار زیادی
- درشت دستور
- ساخته
- دستی
- بسیاری
- بازار یابی (Marketing)
- مسابقه
- مطابق
- شاید
- me
- حافظه
- دقیقه
- اشتباهات
- مدرن
- فناوری های مدرن
- بیش
- اکثر
- بسیار
- چندگانه
- باید
- باریک
- بومی
- ضروری
- هرگز
- جدید
- ویژگی های جدید
- بعد
- نه
- گره
- Node.js و
- اطلاع رسانی
- عدد
- شانس
- of
- on
- ONE
- باز کن
- or
- دیگر
- ما
- خارج
- خود
- درد
- بخش
- ویژه
- الگو
- مردم
- افلاطون
- هوش داده افلاطون
- PlatoData
- پست ها
- پتانسیل
- عملی
- جلوگیری از
- شاید
- مشکل
- روند
- تولید
- محصولات
- سوالات
- سریع
- به سرعت
- کاملا
- تصادفی
- RE
- رسیدن به
- متوجه
- دلیل
- معقول
- اخذ شده
- دوباره به هم متصل
- regex
- منظم
- یادآور
- برداشتن
- از بین بردن
- نشان دادن
- راست
- حلقه
- قانون
- دویدن
- در حال اجرا
- s
- SAAS
- پادمان
- همان
- صحنه های
- جستجو
- به نظر می رسید
- ظاهرا
- فرستنده
- سلسله
- سرور
- سرویس
- سایه
- اشتراک گذاری
- اشتراک
- ورق
- باید
- ساده
- پس از
- خواب
- So
- مزایا
- برخی از
- کسی
- چیزی
- فضا
- خاص
- سنبله
- Stackabuse
- استانداردهای
- آغاز شده
- هنوز
- توقف
- opbevare
- داستان
- سیستم
- گرفتن
- صحبت
- فن آوری
- موقت
- آزمایش
- تست
- متن
- نسبت به
- که
- La
- شان
- آنها
- سپس
- آنجا.
- اینها
- آنها
- چیز
- اشیاء
- فکر می کنم
- این
- زمان
- بار
- به
- هم
- انتقال
- سعی
- اعتماد
- تلاش
- دور زدن
- عطف
- نوع
- انواع
- درک می کند
- متاسفانه
- تا
- به روز رسانی
- us
- استفاده کنید
- استفاده
- کاربر
- کاربران
- با استفاده از
- مختلف
- Ve
- بسیار
- از طريق
- چشم انداز
- منتظر
- می خواهم
- خواسته
- بود
- نبود
- تماشای
- مسیر..
- we
- وب سایت
- هفته
- خوب
- رفت
- بود
- چی
- چه زمانی
- که
- تمام
- چرا
- ویکیپدیا
- آرزو
- با
- مهاجرت کاری
- کارگر
- کارگر
- خواهد بود
- نوشته
- سال
- شما
- شما
- زفیرنت