ทางลัดที่หลายคนเลือกใช้คือการไล่หาคำอันตรายใน SQL มองหา DROP มองหา DELETE บล็อกทุกอย่างที่มีเครื่องหมาย Semicolon วิธีนี้ไม่ได้แค่ไม่ช่วย แต่อันตรายกว่าการไม่ทำอะไรเลย เพราะมันทำให้รู้สึกปลอดภัยทั้งที่ไม่ปลอดภัยจริง คำสั่งเดียวกันใน SQL เขียนได้หลายแบบเกินไป และ String ที่รอดจากการตรวจ Keyword มาได้ ก็ยังก่อความเสียหายได้
การตรวจที่แท้จริงหมายถึงการ Parse โดยในเลเยอร์ข้อมูลที่มี Governance นั้น SQL ของ Agent จะถูกส่งเข้า SQL Parser ของจริง แล้วไล่ตรวจ Syntax Tree ที่ได้ออกมาทั้งต้น ก่อนที่จะมีการเปิด Connection ใด ๆ ไปยังฐานข้อมูล การตรวจนี้จะพิสูจน์สิ่งที่กำหนดไว้ทั้งชุด และปฏิเสธทุกอย่างที่พิสูจน์ไม่ได้:
- มันเป็น Statement เดียวเท่านั้น ไม่ใช่สอง และไม่ใช่ Statement ที่มี Comment ซ่อน Statement ที่สามเอาไว้ ข้อที่เหลือทั้งหมดพิสูจน์ไว้กับ Statement เดียว ถ้ามี Statement ที่สองแอบตามเข้ามา ก็จะไม่มีอะไรพิสูจน์มันเลย
- Statement นั้นอ่านได้อย่างเดียว จะเป็น SELECT หรือ UNION หรือ WITH ก็ได้ ส่วนอะไรก็ตามที่เพิ่ม แก้ไข หรือลบข้อมูล ไม่ว่าจะเป็น INSERT UPDATE DELETE หรือ DROP จะถูกปฏิเสธทันที ไม่ใช่แค่เตือน และซ่อนไว้ตรงไหนใน Statement ก็ถูกจับได้
- ตารางทุกตารางและคอลัมน์ทุกคอลัมน์ต้องเทียบได้กับ Catalog Card ของ Connection นั้น ชื่อใดที่เทียบไม่ได้ว่าตรงกับตารางและคอลัมน์จริงเพียงหนึ่งเดียว จะถูกปฏิเสธ ซึ่งหมายความว่า Agent ไม่มีทางเข้าถึงตารางได้ด้วยการเอ่ยชื่อตารางที่ไม่เคยถูกยื่นให้มันใช้
- ฟังก์ชันทุกตัวต้องอยู่ใน Allow-list ได้แก่ ฟังก์ชันรวมยอด เลขคณิต การจัดการ String และวันที่ ซึ่งเป็นสิ่งที่งานวิเคราะห์ต้องใช้จริง ฟังก์ชันที่ไม่อยู่ในรายการคือการปฏิเสธ และที่ใช้ Allow-list แทน Block-list ก็เพราะฟังก์ชันคือจุดที่ฐานข้อมูลเก็บช่องทางออกนอกกรอบเอาไว้ บางฟังก์ชันอ่านไฟล์ได้ หรือติดต่อออกไปยังเครือข่ายได้ ทั้งที่อยู่ในคำสั่งอ่านที่ดูไม่มีพิษภัย และ Allow-list จะปฏิเสธฟังก์ชันอันตรายที่ยังไม่มีใครรู้จัก พร้อมกับฟังก์ชันที่ทุกคนรู้จักดีอยู่แล้ว
- กลเม็ดต่าง ๆ ถูกปฏิเสธแบบระบุชื่อไว้ชัด รวมถึงเครื่องหมาย Comment แบบสั่งรันได้ ที่ฐานข้อมูลบางตัวแอบรันเป็น SQL จริง สิ่งเหล่านี้ถูกคัดทิ้งก่อนที่การ Parse จะเริ่มด้วยซ้ำ เพราะ Parser อ่าน Comment เป็นเหมือนไม่มีอะไรอยู่ตรงนั้น ขณะที่ฐานข้อมูลจะรัน Comment นั้นเป็นโค้ด และการพิสูจน์ Statement ที่ Parse แล้ว ย่อมไม่มีค่าอะไรเลย ถ้าฐานข้อมูลไปรัน Statement คนละตัว
การตรวจทั้งหมดทำงานเป็น Pure Function หรือการคำนวณที่รับ Statement เข้าไป ตอบว่าผ่านหรือไม่ผ่าน แล้วไม่ไปยุ่งกับอะไรอีกเลย มันไม่เปิด Connection และไม่อ่านข้อมูล ไม่มีใครทำให้มันรั่วไหลด้วยการถามคำถามผิด ๆ ได้ เพราะมันไม่มีอะไรให้รั่ว
กติกาที่อยู่ใต้ทั้งหมดนี้คือ อะไรก็ตามที่เลเยอร์พิสูจน์ไม่ได้ว่าปลอดภัย จะถูกปฏิเสธ กล่าวคือ Parse ไม่ผ่านคือการปฏิเสธ ชื่อที่เทียบไม่ได้คือการปฏิเสธ ความผิดพลาดภายในของตัวตรวจเองก็คือการปฏิเสธ ไม่มีทางแยกไหนที่ความสับสนแปลว่าไปต่อ