บทความนี้เป็นบทความแรกในชุดโพสต์ที่ฉันเขียนเกี่ยวกับการเรียกใช้ผลิตภัณฑ์ SaaS และเว็บไซต์ต่างๆ ในช่วง 8 ปีที่ผ่านมา ฉันจะแบ่งปันปัญหาบางอย่างที่ฉันจัดการ บทเรียนที่ได้เรียนรู้ ข้อผิดพลาดที่ฉันทำ และอาจมีบางสิ่งที่ผิดพลาด แจ้งให้เราทราบ คุณคิดว่ายังไง!
ย้อนกลับไปในปี 2019 หรือ 2020 ฉันตัดสินใจเขียนแบ็กเอนด์ใหม่ทั้งหมด บล็อกผู้ส่งซึ่งเป็นแอปพลิเคชัน SaaS ที่ช่วยให้ผู้ใช้สร้างการบล็อกอีเมลที่ดีขึ้น ท่ามกลางคุณสมบัติอื่นๆ ในกระบวนการนี้ ฉันได้เพิ่มคุณสมบัติใหม่สองสามอย่างและอัปเกรดเป็นเทคโนโลยีที่ทันสมัยมากขึ้น ฉันรันการทดสอบ ปรับใช้โค้ด ทดสอบทุกอย่างในการผลิตด้วยตนเอง และนอกเหนือจากโอกาสสุ่มและการสิ้นสุดแบบสุ่ม ดูเหมือนว่าทุกอย่างทำงานได้ดีมาก ฉันหวังว่านี่จะเป็นจุดสิ้นสุดของเรื่องราว แต่...
ไม่กี่สัปดาห์ต่อมา ฉันได้รับแจ้งจากลูกค้า (ซึ่งเองก็น่าอายเช่นกัน) ว่าบริการใช้งานไม่ได้และพวกเขาได้รับอีเมลจำนวนมากที่ควรถูกบล็อกในกล่องจดหมายของพวกเขา ดังนั้นฉันจึงตรวจสอบ หลายครั้งปัญหานี้เกิดจากการที่ Google ลบการเชื่อมต่อจากบริการของเราไปยังบัญชีผู้ใช้ ซึ่งระบบจะจัดการโดยแจ้งให้ผู้ใช้ทราบทางอีเมลและขอให้เชื่อมต่อใหม่ แต่คราวนี้เป็นอย่างอื่น
ดูเหมือนว่าผู้ปฏิบัติงานแบ็กเอนด์ที่จัดการตรวจสอบอีเมลจากการบล็อกผู้ใช้จะหยุดทำงานทุกๆ 5-10 นาที ส่วนที่แปลกประหลาดที่สุด – ไม่มีข้อผิดพลาดในบันทึก หน่วยความจำยังดี แต่ CPU อาจขัดขวางเป็นครั้งคราวตามเวลาที่ดูเหมือนสุ่ม ดังนั้นใน 24 ชั่วโมงข้างหน้า (โดยมีเวลาพัก 3 ชั่วโมง – ขออภัยลูกค้า 😬) ฉันต้องรีสตาร์ทพนักงานด้วยตนเองทุกครั้งที่เครื่องขัดข้อง ด้วยเหตุผลบางประการ บริการ Elastic Beanstalk รอนานเกินไปในการรีสตาร์ท ซึ่งเป็นเหตุผลว่าทำไมฉันจึงต้องดำเนินการด้วยตนเอง
ปัญหาการแก้ไขจุดบกพร่องในการใช้งานจริงเป็นเรื่องที่ยุ่งยากเสมอ โดยเฉพาะอย่างยิ่งเมื่อฉันไม่สามารถจำลองปัญหาในเครื่องได้ ไม่ต้องพูดถึงสาเหตุที่ทำให้เกิดปัญหา เช่นเดียวกับนักพัฒนาที่ “ดี” คนอื่นๆ ฉันเพิ่งเริ่มบันทึก ทุกอย่าง และรอให้เซิร์ฟเวอร์ล่มอีกครั้ง เนื่องจาก CPU พุ่งสูงขึ้นเป็นระยะๆ ฉันจึงคิดว่าไม่ใช่ปัญหาระดับมหภาค (เช่น เมื่อคุณหน่วยความจำไม่เพียงพอ) และอาจเกิดจากอีเมลหรือผู้ใช้รายใดรายหนึ่ง ดังนั้นฉันจึงพยายามจำกัดให้แคบลง:
- มันขัดข้องกับรหัสอีเมลหรือประเภทใดประเภทหนึ่งหรือไม่?
- มันขัดข้องสำหรับลูกค้ารายใดรายหนึ่งหรือไม่?
- มันขัดข้องในช่วงเวลาปกติหรือไม่?
หลังจากผ่านไปหลายชั่วโมงและจ้องมองบันทึกนานกว่าที่ฉันสนใจ ในที่สุดฉันก็จำกัดขอบเขตให้เหลือเฉพาะลูกค้าเฉพาะรายเท่านั้น จากนั้น พื้นที่การค้นหาก็แคบลงเล็กน้อย เป็นไปได้มากว่าอาจเป็นกฎการบล็อกหรืออีเมลเฉพาะที่เซิร์ฟเวอร์ของเราพยายามเปิดอยู่ โชคดีสำหรับฉัน มันเป็นอย่างแรก ซึ่งเป็นปัญหาที่ง่ายกว่ามากในการแก้ไขเนื่องจากเราเป็นบริษัทที่ให้ความสำคัญกับความเป็นส่วนตัวมาก และไม่จัดเก็บหรือดูข้อมูลอีเมลใดๆ
ก่อนที่เราจะพูดถึงปัญหานั้น เรามาพูดถึงฟีเจอร์หนึ่งของ Block Sender กันก่อน ในเวลานั้น ฉันมีลูกค้าจำนวนมากที่ขอให้บล็อกไวด์การ์ด ซึ่งจะทำให้พวกเขาสามารถบล็อกที่อยู่อีเมลบางประเภทที่เป็นไปตามรูปแบบเดียวกันได้ ตัวอย่างเช่น หากคุณต้องการบล็อกอีเมลทั้งหมดจากที่อยู่อีเมลทางการตลาด คุณสามารถใช้ไวด์การ์ดได้ marketing@*
และจะบล็อกอีเมลทั้งหมดจากที่อยู่ใดๆ ที่ขึ้นต้นด้วย marketing@
.
สิ่งหนึ่งที่ฉันไม่ได้คิดก็คือไม่ใช่ทุกคนที่เข้าใจว่าไวด์การ์ดทำงานอย่างไร ฉันคิดว่าคนส่วนใหญ่จะใช้มันในลักษณะเดียวกับที่ฉันใช้ในฐานะนักพัฒนาซอฟต์แวร์ *
เพื่อแสดงอักขระจำนวนเท่าใดก็ได้ น่าเสียดายที่ผู้ใช้รายนี้คิดว่าคุณจำเป็นต้องใช้ ไวด์การ์ดหนึ่งตัวสำหรับอักขระแต่ละตัวที่คุณต้องการจับคู่. ในกรณีของพวกเขา พวกเขาต้องการบล็อกอีเมลทั้งหมดจากโดเมนใดโดเมนหนึ่ง (ซึ่งเป็นฟีเจอร์ดั้งเดิมที่ Block Sender มี แต่พวกเขาต้องไม่ตระหนัก ซึ่งเป็นปัญหาทั้งหมดในตัวเอง) ดังนั้นแทนที่จะใช้ *@example.com
, พวกเขาใช้ **********@example.com
.
มุมมอง: การดูผู้ใช้ของคุณใช้แอปของคุณ...
ในการจัดการไวด์การ์ดบนเซิร์ฟเวอร์ผู้ปฏิบัติงานของเรา เรากำลังใช้ไลบรารี Node.js ผู้จับคู่ซึ่งช่วยในการจับคู่ glob โดยเปลี่ยนเป็นนิพจน์ทั่วไป ห้องสมุดแห่งนี้ก็จะเปิด **********@example.com
ลงในบางสิ่งเช่น regex ต่อไปนี้:
/[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*@example.com/i
หากคุณมีประสบการณ์กับ regex คุณจะรู้ว่าสิ่งเหล่านี้อาจซับซ้อนได้อย่างรวดเร็วโดยเฉพาะในระดับการคำนวณ การจับคู่นิพจน์ข้างต้นกับข้อความที่มีความยาวพอเหมาะจะมีราคาแพงมากในการคำนวณ ซึ่งท้ายที่สุดก็ทำให้ CPU ทำงานบนเซิร์ฟเวอร์ผู้ปฏิบัติงานของเรา นี่คือเหตุผลว่าทำไมเซิร์ฟเวอร์ถึงหยุดทำงานทุกๆ สองสามนาที มันจะติดขัดในการพยายามจับคู่นิพจน์ทั่วไปที่ซับซ้อนกับที่อยู่อีเมล. ดังนั้นทุกครั้งที่ผู้ใช้รายนี้ได้รับอีเมล นอกเหนือจากการลองใหม่ทั้งหมดที่เราสร้างขึ้นเพื่อจัดการกับความล้มเหลวชั่วคราวแล้ว เซิร์ฟเวอร์ของเราก็จะเสียหายด้วย
แล้วฉันจะแก้ไขปัญหานี้ได้อย่างไร? แน่นอนว่าการแก้ไขอย่างรวดเร็วคือการค้นหาบล็อกทั้งหมดที่มีไวด์การ์ดหลายตัวติดต่อกันแล้วแก้ไขให้ถูกต้อง แต่ฉันยังต้องปรับปรุงการป้อนข้อมูลของผู้ใช้ให้ดียิ่งขึ้นด้วย ผู้ใช้ทุกคนสามารถป้อน regex และลบทั้งระบบด้วย การโจมตี ReDoS.
ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!
การจัดการกรณีนี้ค่อนข้างง่าย – ลบอักขระตัวแทนที่ต่อเนื่องกัน:
block = block.replace(/*+/g, '*')
แต่นั่นยังคงทำให้แอปเปิดรับการโจมตี ReDoS ประเภทอื่น ๆ โชคดีที่มีแพ็คเกจ/ไลบรารีจำนวนมากเพื่อช่วยเราในประเภทนี้เช่นกัน:
การใช้วิธีแก้ปัญหาข้างต้นร่วมกับการป้องกันอื่นๆ ร่วมกัน ทำให้ฉันสามารถป้องกันไม่ให้สิ่งนี้เกิดขึ้นอีกได้ แต่เป็นการเตือนใจที่ดีว่าคุณไม่สามารถเชื่อถือข้อมูลที่ผู้ใช้ป้อนได้ และคุณควรฆ่าเชื้อข้อมูลก่อนนำไปใช้ในแอปพลิเคชันของคุณเสมอ ฉันไม่รู้ด้วยซ้ำว่านี่เป็นปัญหาที่อาจเกิดขึ้นจนกระทั่งมันเกิดขึ้นกับฉัน หวังว่านี่จะช่วยให้คนอื่นหลีกเลี่ยงปัญหาเดียวกันได้
มีคำถาม ความคิดเห็น หรือต้องการแบ่งปันเรื่องราวของคุณเองหรือไม่? เอื้อมมือออกไป Twitter!
- เนื้อหาที่ขับเคลื่อนด้วย SEO และการเผยแพร่ประชาสัมพันธ์ รับการขยายวันนี้
- PlatoData.Network Vertical Generative Ai เพิ่มพลังให้กับตัวเอง เข้าถึงได้ที่นี่.
- เพลโตไอสตรีม. Web3 อัจฉริยะ ขยายความรู้ เข้าถึงได้ที่นี่.
- เพลโตESG. คาร์บอน, คลีนเทค, พลังงาน, สิ่งแวดล้อม แสงอาทิตย์, การจัดการของเสีย. เข้าถึงได้ที่นี่.
- เพลโตสุขภาพ เทคโนโลยีชีวภาพและข่าวกรองการทดลองทางคลินิก เข้าถึงได้ที่นี่.
- ที่มา: https://stackabuse.com/behind-the-scenes-never-trust-user-input/
- :มี
- :เป็น
- :ไม่
- $ ขึ้น
- 1
- 20
- 2019
- 2020
- 24
- 8
- a
- สามารถ
- เกี่ยวกับเรา
- ข้างบน
- ลงชื่อเข้าใช้
- จริง
- ที่เพิ่ม
- นอกจากนี้
- ที่อยู่
- ที่อยู่
- อีกครั้ง
- กับ
- ทั้งหมด
- อนุญาต
- คนเดียว
- ด้วย
- เสมอ
- ในหมู่
- an
- และ
- ใด
- app
- การใช้งาน
- เป็น
- บทความ
- AS
- ขอให้
- สันนิษฐาน
- At
- การโจมตี
- หลีกเลี่ยง
- ทราบ
- แบ็กเอนด์
- BE
- ฝักถั่ว
- จะกลายเป็น
- รับ
- ก่อน
- หลัง
- เบื้องหลัง
- กำลัง
- ดีกว่า
- บิต
- ปิดกั้น
- การปิดกั้น
- Blocks
- ชายแดน
- ทำลาย
- สร้าง
- แต่
- by
- CAN
- สามารถรับ
- ซึ่ง
- กรณี
- ที่เกิดจาก
- การก่อให้เกิด
- บาง
- ตัวอักษร
- อักขระ
- การตรวจสอบ
- รหัส
- การผสมผสาน
- ความคิดเห็น
- บริษัท
- ซับซ้อน
- ซับซ้อน
- การคำนวณ
- การเชื่อมต่อ
- แก้ไข
- ได้
- ไม่สามารถ
- Crash
- ล้มเหลว
- crashing
- สร้าง
- ลูกค้า
- ลูกค้า
- ข้อมูล
- การจัดการ
- ตัดสินใจ
- นำไปใช้
- ผู้พัฒนา
- DID
- didn
- do
- โดเมน
- สวม
- ลง
- สอง
- แต่ละ
- ง่ายดาย
- อื่น
- อีเมล
- อีเมล
- ปลาย
- สิ้นสุดวันที่
- สิ้นสุด
- เข้าสู่
- ทั้งหมด
- ข้อผิดพลาด
- โดยเฉพาะอย่างยิ่ง
- แม้
- ในที่สุด
- ทุกๆ
- ทุกคน
- ทุกอย่าง
- ตัวอย่าง
- แพง
- ประสบการณ์
- การแสดงออก
- ความล้มเหลว
- อย่างเป็นธรรม
- ไกล
- ลักษณะ
- คุณสมบัติ
- สองสาม
- รูป
- คิด
- หา
- ปลาย
- ชื่อจริง
- แก้ไขปัญหา
- โฟกัส
- ตาม
- ดังต่อไปนี้
- สำหรับ
- อดีต
- ราคาเริ่มต้นที่
- ได้รับ
- ได้รับ
- GIF
- ไป
- กำหนด
- ดี
- ยิ่งใหญ่
- ให้คำแนะนำ
- มี
- จัดการ
- จัดการ
- มือบน
- ที่เกิดขึ้น
- สิ่งที่เกิดขึ้น
- มี
- ช่วย
- จะช่วยให้
- หวังว่า
- ชั่วโมง
- โฉบ
- สรุป ความน่าเชื่อถือของ Olymp Trade?
- HTTPS
- i
- ID
- if
- in
- รวม
- อินพุต
- แทน
- เข้าไป
- ปัญหา
- ปัญหา
- IT
- ตัวเอง
- การสัมภาษณ์
- เพียงแค่
- เก็บไว้
- ทราบ
- ชื่อสกุล
- ต่อมา
- ได้เรียนรู้
- การเรียนรู้
- ความยาว
- บทเรียน
- ให้
- ชั้น
- LG
- ห้องสมุด
- กดไลก์
- น่าจะ
- ll
- ในท้องถิ่น
- การเข้าสู่ระบบ
- นาน
- อีกต่อไป
- มอง
- จำนวนมาก
- แมโคร
- ทำ
- ด้วยมือ
- หลาย
- การตลาด
- การจับคู่
- การจับคู่
- อาจจะ
- me
- หน่วยความจำ
- นาที
- ความผิดพลาด
- ทันสมัย
- เทคโนโลยีสมัยใหม่
- ข้อมูลเพิ่มเติม
- มากที่สุด
- มาก
- หลาย
- ต้อง
- แคบ
- พื้นเมือง
- จำเป็น
- ไม่เคย
- ใหม่
- คุณสมบัติใหม่
- ถัดไป
- ไม่
- ปม
- Node.js
- แจ้ง
- จำนวน
- ราคาต่อรอง
- of
- on
- ONE
- เปิด
- or
- อื่นๆ
- ของเรา
- ออก
- ของตนเอง
- อาการเจ็บปวด
- ส่วนหนึ่ง
- ในสิ่งที่สนใจ
- แบบแผน
- คน
- เพลโต
- เพลโตดาต้าอินเทลลิเจนซ์
- เพลโตดาต้า
- โพสต์
- ที่มีศักยภาพ
- ประยุกต์
- ป้องกัน
- อาจ
- ปัญหา
- กระบวนการ
- การผลิต
- ผลิตภัณฑ์
- คำถาม
- รวดเร็ว
- อย่างรวดเร็ว
- ทีเดียว
- สุ่ม
- RE
- มาถึง
- ตระหนัก
- เหตุผล
- เหมาะสม
- ที่ได้รับ
- เชื่อมต่อ
- นิพจน์ทั่วไป
- ปกติ
- การแจ้งเตือน
- เอาออก
- ลบ
- แสดง
- ขวา
- แหวน
- กฎ
- วิ่ง
- วิ่ง
- s
- SaaS
- การป้องกัน
- เดียวกัน
- ฉาก
- ค้นหา
- ดูเหมือน
- ดูเหมือนว่า
- ผู้ส่ง
- ชุด
- เซิร์ฟเวอร์
- บริการ
- เงา
- Share
- ใช้งานร่วมกัน
- แผ่น
- น่า
- ง่าย
- ตั้งแต่
- นอนหลับ
- So
- โซลูชัน
- บาง
- บางคน
- บางสิ่งบางอย่าง
- ช่องว่าง
- โดยเฉพาะ
- ขัดขวาง
- สแต็ค
- มาตรฐาน
- ข้อความที่เริ่ม
- ยังคง
- หยุด
- จัดเก็บ
- เรื่องราว
- ระบบ
- เอา
- คุย
- เทคโนโลยี
- ชั่วคราว
- การทดสอบ
- การทดสอบ
- ข้อความ
- กว่า
- ที่
- พื้นที่
- ของพวกเขา
- พวกเขา
- แล้วก็
- ที่นั่น
- ล้อยางขัดเหล่านี้ติดตั้งบนแกน XNUMX (มม.) ผลิตภัณฑ์นี้ถูกผลิตในหลายรูปทรง และหลากหลายเบอร์ความแน่นหนาของปริมาณอนุภาคขัดของมัน จะทำให้ท่านได้รับประสิทธิภาพสูงในการขัดและการใช้งานที่ยาวนาน
- พวกเขา
- สิ่ง
- สิ่ง
- คิด
- นี้
- เวลา
- ครั้ง
- ไปยัง
- เกินไป
- การเปลี่ยนแปลง
- พยายาม
- วางใจ
- พยายาม
- กลับ
- การหมุน
- ชนิด
- ชนิด
- เข้าใจ
- น่าเสียดาย
- จนกระทั่ง
- อัพเกรด
- us
- ใช้
- มือสอง
- ผู้ใช้งาน
- ผู้ใช้
- การใช้
- ต่างๆ
- Ve
- มาก
- ผ่านทาง
- รายละเอียด
- ที่รอ
- ต้องการ
- อยาก
- คือ
- เคยเป็น
- ชม
- ทาง..
- we
- เว็บไซต์
- สัปดาห์ที่ผ่านมา
- ดี
- ไป
- คือ
- อะไร
- เมื่อ
- ที่
- ทั้งหมด
- ทำไม
- วิกิพีเดีย
- ต้องการ
- กับ
- งาน
- ผู้ปฏิบัติงาน
- การทำงาน
- จะ
- การเขียน
- ปี
- คุณ
- ของคุณ
- ลมทะเล