นักพัฒนาแชร์ทางเลือกที่ปลอดภัยกว่าการใช้ Raw SQL Query Interfaces หลังเรื่องสยองขวัญไวรัล

ทีมชุมชน BigGo
นักพัฒนาแชร์ทางเลือกที่ปลอดภัยกว่าการใช้ Raw SQL Query Interfaces หลังเรื่องสยองขวัญไวรัล

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

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

ไทม์ไลน์วิวัฒนาการ: จากรายงานสู่ความเสี่ยงด้านความปลอดภัย

  • สถานะเริ่มต้น: หน้ารายงานมาตรฐานที่มีช่วงวันที่และตัวกรองคำสำคัญ
  • ปีที่ 1-3: เพิ่มฟิลด์เพิ่มเติม สร้างเมนูแบบเลื่อนลงสำหรับประเภทรายงาน
  • ปีที่ 4-6: ชื่อรายงานที่ขับเคลื่อนด้วยฐานข้อมูล รายงานแบบกำหนดเองสำหรับนักวิเคราะห์
  • ปีที่ 7-8: เปิดตัวหน้าผู้ดูแลระบบลับที่มีความสามารถ SQL แบบดิบ
  • ปีที่ 9-10: เพิ่มตัวกรองความปลอดภัยแบบสตริง ใช้งานการจำกัดเวลาการสืบค้น
  • สถานะสุดท้าย: กล่องข้อความ SQL แบบเต็มรูปแบบที่มีมาตรการป้องกันขั้นต่ำ

ความปลอดภัยระดับฐานข้อมูล: รากฐานสำคัญ

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

แนวทางนี้เชื่อถือได้มากกว่าการกรองแบบสตริงที่พยายามบล็อกคำสำคัญอันตรายเช่น INSERT, UPDATE หรือ DELETE ตัวกรองดังกล่าวสามารถถูกหลีกเลี่ยงได้ง่ายและไม่คำนึงถึงความซับซ้อนของ SQL สมัยใหม่ รวมถึง stored procedures และ functions ที่อาจมีสิทธิ์ขั้นสูง

Structured Query Languages: ทางกลาง

นักพัฒนาหลายคนแชร์ประสบการณ์กับภาษาคำสั่งแบบกำหนดเองที่ให้ความยืดหยุ่นโดยไม่มีอันตรายของ SQL แบบดิบ ภาษาเฉพาะโดเมนเหล่านี้ช่วยให้ผู้ใช้สามารถแสดงคำสั่งที่ซับซ้อนโดยใช้ไวยากรณ์ที่เรียบง่ายซึ่งถูกแปลเป็น SQL ที่ปลอดภัยเบื้องหลัง ตัวอย่างเช่น คำสั่งเช่น name*~john emp_id>3000 สามารถถูกแยกวิเคราะห์และแปลงเป็น SQL ที่เหมาะสมพร้อมการตรวจสอบความปลอดภัยในตัว

แนวทางนี้ให้สิ่งที่ดีที่สุดของทั้งสองโลก - ผู้ใช้ขั้นสูงได้รับความยืดหยุ่นที่ต้องการ ในขณะที่ระบบยังคงควบคุมการดำเนินการที่ถูกทำจริง บางคนชี้ไปที่ตัวอย่างที่มีอยู่เช่น JQL ( Jira Query Language ) ของ Jira เป็นการใช้งานที่ประสบความสำเร็จของแนวคิดนี้

เครื่องมือเฉพาะและสภาพแวดล้อมแยก

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

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

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

การแยกวิเคราะห์และการตรวจสอบขั้นสูง

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

อย่างไรก็ตาม แนวทางนี้ต้องใช้ความเชี่ยวชาญทางเทคนิคอย่างมากและการบำรุงรักษาอย่างต่อเนื่องเมื่อมาตรฐาน SQL วิวัฒนาการ มันยังไม่ใช่หลักฐานที่แน่นอน - แม้แต่คำสั่ง SELECT ก็สามารถก่อให้เกิดปัญหาได้ผ่านการเข้าร่วมที่มีราคาแพงหรือการเรียกฟังก์ชันที่มีผลข้างเคียง

มาตรการรักษาความปลอดภัยที่แนะนำสำหรับอินเทอร์เฟซคิวรี SQL

วิธีการ ระดับความปลอดภัย ความยากในการนำไปใช้ ความยืดหยุ่นของผู้ใช้
การกำหนดสิทธิ์ระดับฐานข้อมูล สูง ต่ำ ปานกลาง
ภาษาคิวรีแบบกำหนดเอง สูง สูง ปานกลาง
เครื่องมือเฉพาะทาง ( DBeaver , Redash ) สูง ต่ำ สูง
การตรวจสอบ SQL parsing/AST ปานกลาง สูง สูง
การกรองแบบ String-based ต่ำ ต่ำ สูง
สภาพแวดล้อมการวิเคราะห์แยกต่างหาก สูง ปานกลาง สูง

บทเรียนสำหรับการพัฒนาสมัยใหม่

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

ฉันทามติในหมู่นักพัฒนาที่มีประสบการณ์ชัดเจน: หากผู้ใช้ต้องการการเข้าถึงฐานข้อมูลโดยตรง ควรจัดหาผ่านเครื่องมือที่เหมาะสมด้วยมาตรการความปลอดภัยที่เหมาะสม ไม่ใช่ผ่านอินเทอร์เฟซเว็บที่สร้างขึ้นเองด้วยกลไกการป้องกันแบบเฉพาะกิจSQL Injection as a Service (SIAAS): คำที่ตลกขบขันที่อธิบายเว็บแอปพลิเคชันที่โดยไม่ได้ตั้งใจให้ผู้ใช้สามารถดำเนินการคำสั่ง SQL ตามอำเภอใจ โดยพื้นฐานแล้วให้การเข้าถึงเหมือนกับที่การโจมตี SQL injection จะทำ Abstract Syntax Tree (AST): การแสดงต้นไม้ของโครงสร้างของซอร์สโค้ด ใช้โดยตัวแยกวิเคราะห์เพื่อเข้าใจและตรวจสอบความหมายของโค้ดก่อนการดำเนินการ

อ้างอิง: SQL Injection as a Feature