sql substring_index - ฟังก์ชันค้นหาสตริงใน SQL - ฟังก์ชันค้นหาสตริงใน SQL

ช่องโหว่ด้านความปลอดภัยที่ซ่อนเร้นของคำสั่ง SQL SUBSTRING_INDEX

สารบัญ

บทความที่ต้องอ่าน

บทความล่าสุดที่น่าสนใจ

ฟังก์ชันเดียว แต่มีช่องโหว่ให้โจมตีได้กว้างขวาง

ลองนึกภาพดู: คุณกำลังสร้างไมโครเซอร์วิสที่ประมวลผลการลงทะเบียนผู้ใช้ ในขั้นตอนใดขั้นตอนหนึ่งของเวิร์กโฟลว์ คุณได้ทำการตัดแต่งที่อยู่อีเมลโดยใช้ ดัชนีสตริงย่อยใน SQL เพื่อรับโดเมน มันเรียบร้อย สั้น และใช้งานได้ดีในสภาพแวดล้อมทดสอบ ต่อมา ในระหว่างการใช้งานจริง ไฟล์บันทึกเริ่มเต็มไปด้วยชื่อเต็มและโดเมนอีเมลในรูปแบบข้อความธรรมดา ซึ่งเป็นการรั่วไหลโดยไม่ได้ตั้งใจจากการเรียกใช้คำสั่ง SQL ที่ดูเหมือนไม่มีอันตรายอะไร

นี่แหละคือปัญหา: ดัชนีสตริงย่อย SQL `truth()` เป็นหนึ่งในฟังก์ชันสตริงใน SQL ที่ดูเหมือนปลอดภัยจนกว่าจะถูกนำไปใช้ผิดที่ ในแอปพลิเคชัน SaaS แบบหลายผู้เช่าหรือระบบที่จัดการข้อมูลที่ละเอียดอ่อน การใช้งานผิดวิธีอาจเปิดเผยข้อมูลส่วนตัวหรือแม้กระทั่งอนุญาตให้มีการยกระดับสิทธิ์โดยไม่ทำให้เกิดการแจ้งเตือนที่ชัดเจน ในสภาพแวดล้อมที่สำคัญ โดยเฉพาะอย่างยิ่งแพลตฟอร์มแบบหลายผู้เช่าที่การสืบค้นข้อมูลเพียงครั้งเดียวอาจให้บริการลูกค้าหลายราย ข้อผิดพลาดเล็กน้อยในตรรกะตัวคั่นใน `truth()` อาจทำให้เกิดปัญหาได้ ดัชนีสตริงย่อยใน SQL อาจนำไปสู่การเปิดเผยข้อมูลระหว่างผู้เช่าหลายราย และข้อมูลรั่วไหลระหว่างชุดข้อมูลที่แยกจากกัน

ทำความเข้าใจ SUBSTRING_INDEX ในโค้ดจริง

ใน MySQL และ MariaDB ฟังก์ชัน `substring_index` ของ SQL รับอาร์กิวเมนต์สามตัว ได้แก่ สตริงที่จะประมวลผล ตัวคั่น และจำนวนนับ โดยจะส่งคืนส่วนหนึ่งของสตริงก่อนหรือหลังตัวคั่นนั้น

โดยทั่วไปแล้ว ฟังก์ชัน substring_index มักใช้ในคำสั่งค้นหาข้อมูลในแอปพลิเคชันเพื่อแยกค่าที่มีโครงสร้างซึ่งจัดเก็บอยู่ในฟิลด์เดียวอย่างรวดเร็ว เช่น การแยกอีเมลออกเป็นชื่อผู้ใช้และโดเมน การแยกโดเมนย่อยจาก URL หรือการแยกคำนำหน้าจากคีย์ผสม นักพัฒนาซอฟต์แวร์มักเลือกใช้ substring_index ใน SQL แทนการแยกวิเคราะห์ฝั่งแอปพลิเคชัน เนื่องจากมีความกระชับกว่าcise ช่วยหลีกเลี่ยงการประมวลผลเพิ่มเติมภายนอกฐานข้อมูล และสามารถนำไปใช้โดยตรงในการกรอง การเชื่อมต่อ และการจัดกลุ่มได้

ตัวอย่าง: การดึงชื่อผู้ใช้และโดเมนจากอีเมล

sql SELECT      SUBSTRING_INDEX(email, '@', 1) AS username,     SUBSTRING_INDEX(email, '@', -1) AS domain

จากผู้ใช้;

กรณีการใช้งานทั่วไปของ substring_index ใน SQL ได้แก่:

  • ดึงชื่อผู้ใช้สำหรับข้อความต้อนรับ
  • ตรวจสอบความถูกต้องของโดเมนอีเมลกับรายการที่อนุญาต/ไม่อนุญาต
  • การจัดกลุ่มผู้ใช้ตามโดเมนในแบบสอบถามการวิเคราะห์

เพราะ ดัชนีสตริงย่อยของ SQL คือคอนcisเนื่องจากมีความรวดเร็วและมีประสิทธิภาพ นักพัฒนาจึงมักใช้มันโดยตรงในฟังก์ชันสตริงใน SQL สำหรับการกรอง การตรวจสอบความถูกต้อง หรือการรายงาน ปัญหาเริ่มขึ้นเมื่อตัวคั่นหรือจำนวนนับเป็นแบบไดนามิกและมาจากข้อมูลที่ผู้ใช้ป้อน

ช่องโหว่ด้านความปลอดภัย – ดัชนีสตริงย่อยใน SQL

รูปแบบความเสี่ยงหลักสามประการได้แก่... ดัชนีสตริงย่อยใน SQL กลายเป็นภาระผูกพัน โดยเฉพาะในระบบที่มีผู้เช่าหลายรายหรือระบบที่มีความเสี่ยงสูง:

การเปิดเผยข้อมูลมากเกินไป

ในฐานข้อมูลที่ใช้ร่วมกัน ข้อผิดพลาดเพียงเล็กน้อย เช่น การนับตัวคั่นผิดหนึ่งตัว อาจทำให้ข้อมูลสำคัญรั่วไหลไปยังผู้เช่ารายอื่นหรือผู้ใช้ที่ไม่เกี่ยวข้องได้

sql -- Intended: first name only SELECT SUBSTRING_INDEX(full_name, ' ', 1); -- Bug: leaks full name and extra fields SELECT SUBSTRING_INDEX(full_name, ' ', 3); 

ในระบบ CRM ที่มีผู้ใช้งานหลายราย ข้อมูลนี้อาจเปิดเผยชื่อลูกค้าเต็มรูปแบบจากบริษัทอื่นๆ ในไฟล์ CSV ที่ส่งออกของผู้ใช้งานแต่ละราย

ข้อมูลป้อนเข้าว่างเปล่าหรือผิดรูปแบบ

หากไม่มีตัวคั่นหรือข้อมูลที่ป้อนเป็นค่าว่าง ดัชนีสตริงย่อยของ SQL สามารถส่งคืนฟิลด์ทั้งหมดได้ ในระบบที่สำคัญ อาจทำให้รหัสภายใน เมตาเดต้าที่เชื่อมต่อกัน หรือค่าการดีบักที่ไม่ควรเปิดเผยต่อภายนอกถูกเปิดเผยได้

การเข้าถึงที่ไม่ได้รับอนุญาตในการเชื่อมต่อหรือแบบสอบถามย่อย

ในระบบที่มีผู้เช่าหลายราย การใช้ฟังก์ชันสตริงใน SQL สำหรับการกำหนดขอบเขตผู้เช่าอย่างไม่ระมัดระวังอาจทำให้การแยกการทำงาน (isolation) เสียไป:

SELECT o.id, o.amount, t.name FROM orders o JOIN tenants t   ON SUBSTRING_INDEX(o.customer_ref, '-', 1) = t.tenant_code; 

If ลูกค้า_อ้างอิง หากรูปแบบข้อมูลไม่สอดคล้องกันหรือผู้ใช้ควบคุมข้อมูลเอง ผู้เช่า A อาจเรียกดูคำสั่งซื้อของผู้เช่า B ได้ ในระบบการชำระเงินหรือแพลตฟอร์มด้านการดูแลสุขภาพ นี่ถือเป็นการละเมิดนโยบายการแยกข้อมูลโดยตรง

ตัวอย่างความเสี่ยงจากผู้เช่าหลายราย: ลองนึกภาพแพลตฟอร์มการออกใบแจ้งหนี้แบบ SaaS ที่... ลูกค้า_อ้างอิง เข้ารหัสรหัสผู้เช่าก่อนเครื่องหมายขีดกลาง (รหัสผู้เช่าหากผู้ใช้ที่เป็นอันตรายส่งข้อมูลอ้างอิงคำสั่งซื้อโดยใช้รหัสผู้เช่ารายอื่น แต่มีหมายเลขคำสั่งซื้อที่ถูกต้อง และการเชื่อมต่อใช้ ดัชนีสตริงย่อยใน SQL หากไม่มีการตรวจสอบความถูกต้อง พวกเขาสามารถเข้าถึงข้อมูลใบแจ้งหนี้ที่เป็นขององค์กรอื่นได้อย่างสิ้นเชิง

ช่องทางการโจมตีที่แท้จริงใน CI/CD และรหัสโอเพนซอร์ส

การใช้ในทางที่ผิดของ ดัชนีสตริงย่อย SQL นี่ไม่ใช่แค่ความผิดพลาดของนักพัฒนาซอฟต์แวร์มือใหม่เท่านั้น แต่ยังปรากฏให้เห็นใน:

  • คำสั่งค้นหา ORM ที่มีตัวคั่นแบบไดนามิก
  • สตored procedure ในปลั๊กอินโอเพนซอร์ส
  • คำสั่ง SQL แบบอินไลน์ที่เชื่อมต่อพารามิเตอร์คำขอโดยตรง

โค้ดที่ไม่ปลอดภัยเข้าสู่ขั้นตอนการผลิตได้อย่างไร:

Developer writes query using substring_index in sql       ↓   Code is committed and pushed to the repository       ↓   Automated build runs (no SQL security checks)       ↓   Code review focuses on business logic, not string functions in SQL       ↓   Changes are merged into the main branch       ↓   Application is deployed to production   

หากไม่มีการตรวจสอบอัตโนมัติสำหรับฟังก์ชันสตริงที่ไม่ปลอดภัยใน SQL ความเสี่ยงเหล่านี้อาจผ่านการตรวจสอบไปโดยไม่ทันสังเกตและเข้าสู่ขั้นตอนการใช้งานจริง ซึ่งอาจทำให้ข้อมูลสำคัญรั่วไหลได้ตั้งแต่วันแรก

การตรวจจับใน SAST/ซีไอ-ซีดี

วิธีที่ปลอดภัยที่สุดในการจัดการกับความเสี่ยง ดัชนีสตริงย่อยใน SQL รูปแบบดังกล่าวคือการบล็อกพวกมันก่อนที่จะรวมเข้าด้วยกัน

กฎการตรวจจับควรครอบคลุมสิ่งต่อไปนี้:

  • การใช้งานของ ดัชนีสตริงย่อย SQL โดยใช้ตัวคั่นหรือจำนวนนับจากพารามิเตอร์คำขอ
  • การตรวจสอบตัวคั่นที่ขาดหายไป

ตัวอย่างกฎขั้นต่ำ:

yaml rules:   - id: mysql-substring-index-dynamic-delimiter     languages: [sql]     message: Avoid SUBSTRING_INDEX with dynamic delimiter or count.     severity: error 

Pipeline ขั้นตอน:

yaml  - name: SAST – SQL rules   run: semgrep --config semgrep-sql.yml --error 

ด้วยการสแกนหาฟังก์ชันสตริงที่ไม่ปลอดภัยใน SQL ระหว่างการตรวจสอบ Pull Request คุณจะขจัดความไม่แน่นอนในการตรวจสอบโค้ดได้

กลยุทธ์การลดผลกระทบสำหรับนักพัฒนา

การตรวจจับการใช้งานที่เสี่ยง ดัชนีสตริงย่อย SQL การได้รับการตรวจสอบหรือสแกนอย่างละเอียดนั้นเป็นเรื่องดี แต่สิ่งที่ดีที่สุดคือการไม่นำวิธีการดังกล่าวมาใช้ตั้งแต่แรก เหตุการณ์ด้านความปลอดภัยจำนวนมากเกิดขึ้นเพราะนักพัฒนาพึ่งพาทางลัดที่คุ้นเคยโดยไม่พิจารณาถึงกรณีพิเศษ

นี่คือวิธีป้องกันปัญหาเมื่อทำงานกับ ดัชนีสตริงย่อยใน SQL หรือฟังก์ชันสตริงที่คล้ายกันใน SQL:

ตรวจสอบตำแหน่งตัวคั่นก่อนดำเนินการ
อย่าคิดเอาเองว่าตัวคั่นมีอยู่และอยู่ในตำแหน่งที่ถูกต้อง ในระบบที่มีผู้เช่าหลายราย ตัวคั่นที่ไม่คาดคิดเพียงตัวเดียวในตัวระบุอาจเปิดช่องให้เข้าถึงข้อมูลของผู้เช่ารายอื่นได้

sql  SELECT      CASE          WHEN LOCATE('@', email) > 0          THEN SUBSTRING_INDEX(email, '@', 1)          ELSE NULL      END AS username FROM users; 
  1. ตรวจสอบความยาวเอาต์พุตที่คาดหวัง
    กำหนดขอบเขตที่ปลอดภัย หากผลลัพธ์ของสตริงย่อยสั้นหรือยาวเกินไป ให้ถือว่าไม่ถูกต้อง
  2. ทำความสะอาดและเข้ารหัสข้อมูลก่อนใช้งาน
    ลบตัวคั่นที่ไม่พึงประสงค์ออกจากข้อมูลที่ผู้ใช้ป้อนก่อนที่จะส่งไปยัง SQL
  3. หลีกเลี่ยง ดัชนีสตริงย่อยใน SQL ในตรรกะที่สำคัญต่อความปลอดภัย
    ห้ามใช้ฟังก์ชันนี้ในการตรวจสอบสิทธิ์ การแยกผู้เช่า หรือสิ่งใดก็ตามที่ควบคุมการเข้าถึงข้อมูลที่ละเอียดอ่อน การแยกวิเคราะห์ไม่ใช่ขอบเขตด้านความปลอดภัย
  4. ย้ายการประมวลผลการแยกวิเคราะห์ไปไว้ที่เลเยอร์แอปพลิเคชัน ตรรกะฝั่งแอปพลิเคชันช่วยให้คุณควบคุมการตรวจสอบความถูกต้อง การจัดการข้อผิดพลาด และการทดสอบหน่วยได้ดียิ่งขึ้น
python  def safe_split_email(email):     if '@' not in email:         raise ValueError("Invalid email")     username, domain = email.split('@', 1)     if '.' not in domain:         raise ValueError("Invalid domain")     return username, domain 

การถือว่าฟังก์ชันสตริงใน SQL เป็นเส้นทางการทำงานของโค้ดที่ไม่น่าเชื่อถือ จะช่วยลดขอบเขตความเสียหายจากข้อผิดพลาดทางตรรกะใดๆ ได้

การผสานรวมกับเครื่องมือรักษาความปลอดภัย 

แม้แต่ทีมที่มีทักษะสูงก็ไม่สามารถพึ่งพาการตรวจสอบด้วยตนเองเพียงอย่างเดียวได้ รูปแบบที่มีความเสี่ยง เช่น ความไม่ปลอดภัย ดัชนีสตริงย่อย SQL การใช้งานที่ไม่ถูกต้องอาจหลุดรอดไปได้ โดยเฉพาะในโค้ดเบสขนาดใหญ่ หรือเมื่อต้องจัดการกับโค้ดของบุคคลที่สาม

เหตุใดจึงควรผสานรวมเครื่องมืออย่าง Xygeni:

  • ครอบคลุมทั้งโค้ดโอเพนซอร์สและโค้ดกรรมสิทธิ์: ตรวจสอบให้แน่ใจว่าไม่มีช่องโหว่ซ่อนอยู่ในแพ็กเกจของผู้จำหน่ายหรือโมดูลรุ่นเก่า
  • ตรวจจับรูปแบบที่ไม่ปลอดภัยในสคริปต์ SQL และโค้ดแอปพลิเคชัน: การค้นหา ดัชนีสตริงย่อยใน SQL มีการใช้งานผิดวิธี แม้ว่าจะฝังอยู่ในสตริงภายใน Python, Java หรือ Node.js ก็ตาม
  • ผสานรวมเข้ากับระบบโดยตรง CI/CD pipelinesการสร้างจะล้มเหลวโดยอัตโนมัติหากไม่ปลอดภัย ฟังก์ชันสตริงใน SQL ตรวจพบแล้ว
  • ให้คำแนะนำในการแก้ไขปัญหาที่นำไปปฏิบัติได้จริง: แสดงให้ผู้พัฒนาเห็นอย่างชัดเจนว่าส่วนใดของคำสั่ง SQL ที่มีความเสี่ยง สาเหตุ และวิธีการแก้ไข

ตัวอย่างเวิร์กโฟลว์ด้วย Xygeni ใน CI/CD ความปลอดภัย:

Source → Commit → Build          → SQL Scan (Xygeni)          → Fail build if violations found          → Remediation & re-scan          → Merge & Deploy 

การสแกนอย่างต่อเนื่อง ก่อนการใช้งานจริงนั้นมีความสำคัญอย่างยิ่งซึ่งจะช่วยให้มั่นใจได้ว่าการใช้งานที่มีความเสี่ยงจะไม่เกิดขึ้น ดัชนีสตริงย่อย sql ช่องโหว่เหล่านี้ไม่เพียงแต่ถูกตรวจพบในระหว่างการพัฒนาขั้นต้นเท่านั้น แต่ยังรวมถึงในการอัปเดต การปรับโครงสร้าง และการเปลี่ยนแปลงการพึ่งพาในภายหลังด้วย แนวทางเชิงรุกนี้หมายความว่าช่องโหว่จะถูกกำจัดก่อนที่จะถึงขั้นตอนการใช้งานจริง

ข้อควรจำสำหรับนักพัฒนา – เกี่ยวกับ substring_index ใน SQL

นี่คือบรรทัดล่าง:

  • ดัชนีสตริงย่อย SQL โดยพื้นฐานแล้วมันไม่ได้แย่ แต่การใช้งานที่ไม่เหมาะสมจะกลายเป็นช่องโหว่ที่ทำให้ข้อมูลรั่วไหลโดยไม่รู้ตัว
  • ทุกๆ ดัชนีสตริงย่อยใน SQL การโทรผ่านเส้นทางที่มีความสำคัญด้านความปลอดภัยควรได้รับการพิจารณาว่าน่าสงสัยจนกว่าจะได้รับการพิสูจน์ว่าปลอดภัย
  • ฟังก์ชันสตริงทั้งหมดใน SQL อาจเป็นอันตรายได้ในบริบทที่ขอบเขตข้อมูลหรือสิทธิ์การเข้าถึงมีความสำคัญ ควรพิจารณาฟังก์ชันเหล่านี้ว่าเป็นอันตรายได้เสมอในสภาพแวดล้อมที่ละเอียดอ่อน แม้ว่าฟังก์ชันเหล่านั้นจะดูเรียบง่ายหรือไม่มีอันตรายก็ตาม

ขั้นตอนต่อไปที่ทีมพัฒนาสามารถนำไปปฏิบัติได้จริง:

  1. ตรวจสอบโค้ดของคุณ สำหรับการใช้งานใดๆ ของ ดัชนีสตริงย่อย SQL ในการเชื่อมต่อข้อมูล การสืบค้นย่อย หรือตรรกะการควบคุมการเข้าถึง
  2. เพิ่ม SAST กฎระเบียบ เพื่อตรวจจับตัวคั่นแบบไดนามิกและข้อมูลป้อนเข้าที่ไม่ได้รับการตรวจสอบใน ฟังก์ชันสตริงใน SQL.
  3. ย้ายการวิเคราะห์ไวยากรณ์ไปที่เลเยอร์แอปพลิเคชัน เป็นไปได้ทุกที่
  4. ทำการสแกนอย่างต่อเนื่อง โดยใช้เครื่องมืออย่าง Xygeni เพื่อตรวจจับการใช้งานที่ไม่ปลอดภัยก่อนนำไปใช้งานจริง

การรักษาความปลอดภัยไม่ได้หมายถึงแค่การอุดช่องโหว่หลังจากเกิดปัญหาแล้วเท่านั้น แต่หมายถึงการผนวกการป้องกันเข้าไปในกระบวนการทำงานตั้งแต่ต้น หากคุณรักษา ดัชนีสตริงย่อย SQL และใช้ฟังก์ชันสตริงอื่นๆ ใน SQL ด้วยความระมัดระวังเช่นเดียวกับการป้อนข้อมูลจากผู้ใช้โดยตรง คุณจะหลีกเลี่ยงการเปลี่ยนตัวช่วยที่สะดวกให้กลายเป็นบรรทัดที่อันตรายที่สุดในคำสั่ง SQL ของคุณได้

sca-tools-software-composition-analysis-tools
จัดลำดับความสำคัญ แก้ไข และรักษาความปลอดภัยความเสี่ยงด้านซอฟต์แวร์ของคุณ
สมัครบัญชีฟรีได้เลย
ไม่ต้องใช้บัตรเครดิต

รักษาความปลอดภัยให้กับการพัฒนาและส่งมอบซอฟต์แวร์ของคุณ

ด้วยชุดผลิตภัณฑ์ Xygeni