AI Survival ตรวจ query ของ AI
Capstone ตรวจ 7 patterns อันตราย DROP TABLE, DELETE without WHERE, SQL injection, GRANT ALL ให้พร้อมรับยุคที่ AI เขียน SQL ให้
ผ่านมาแล้ว 7 บท เราเขียน SQL พื้นฐานเป็น อ่าน schema ออก เข้าใจ JOIN และเข้าใจ transaction บทสุดท้ายนี้คือทักษะที่ ขาดไม่ได้ในยุคนี้ นั่นคือการตรวจ query ที่ AI เขียนให้ ก่อนกด Enter
ทำไมต้องตรวจ AI
AI เขียน SQL ได้เร็วมาก และส่วนใหญ่ก็ถูกด้วย แต่ AI ไม่ได้รับผิดชอบแทนเรา ถ้า AI generate query ที่ DROP ตาราง production แล้วเรา copy ไปรันโดยไม่อ่าน AI ไม่ได้โดนไล่ออก เราต่างหากที่โดน
pattern ที่พลาดได้บ่อยเวลา copy query ของ AI มารัน เช่น
- ขอ AI ช่วย "ลบ test data ใน table users" AI generate
DELETE FROM users;ออกมา อ่านผ่านๆ เหมือนถูก ทั้งที่เป็นคำสั่งลบทั้งตารางลูกค้า ถ้ารันใน production ก็คือลูกค้าทุกคนหายในคำสั่งเดียว - Login function ที่ใช้
`SELECT * FROM users WHERE name = '${input}'`ต่อ string ตรงเข้า query ถ้ามี input เข้ามาเป็น' OR '1'='1เงื่อนไขจะกลายเป็น จริงเสมอ bypass login ได้ทันที SELECT * FROM ordersที่ไม่มี LIMIT รันบน table ที่มี 50 ล้าน row network จะดึงข้อมูลเป็น GB backend OOM และ browser render ไม่ไหว crash ทั้งหน้าพร้อมปุ่ม Enter
7 patterns ที่ต้องดูเป็นชีวิตจิตใจ
1. DROP TABLE หรือ DROP DATABASE (critical)
DROP TABLE users หมายถึงลบทั้งโครงสร้างและข้อมูล กู้ได้ก็แค่จาก backup เท่านั้น AI บางครั้งใช้ DROP เพื่อ "เริ่มใหม่" อย่ายอมเด็ดขาด
2. TRUNCATE TABLE (critical)
เร็วกว่า DELETE เพราะข้าม transaction log บางฐานอย่าง PostgreSQL ก็ rollback ได้ แต่บางฐานอย่าง MySQL InnoDB rollback ไม่ได้ หมายความว่าผิดปุ๊บข้อมูลก็หายเลย
3. DELETE FROM ที่ไม่มี WHERE (critical)
บทที่แล้วเราเห็นมาแล้ว นี่คือ pattern อันดับหนึ่ง ที่ทำพังบริษัทมานับไม่ถ้วน ต้องระวังที่สุด
4. UPDATE SET ที่ไม่มี WHERE (high)
UPDATE products SET stock = 0 หมายถึง สินค้าทุกชิ้นหมด stock ขายต่อไม่ได้ และ UPDATE products SET price = 0 ก็คือสินค้าทุกชิ้นกลายเป็นของฟรี
5. SQL Injection pattern (high)
ถ้าเห็น ' วางคู่กับตัวแปร input ใน SQL คือสัญญาณอันตรายทันที ตัวอย่างเช่น
-- ❌ AI อาจเขียนแบบนี้ออกมา
const sql = `SELECT * FROM users
WHERE name = '${input}'`;
// ถ้า input คือ "' OR '1'='1" ก็ bypass login ได้เลย
-- ✅ วิธีที่ถูกคือใช้ parameterized
db.prepare('SELECT * FROM users WHERE name = ?')
.get(input);6. GRANT ALL (medium)
Database user ที่ใช้กับ app ไม่ควรได้รับสิทธิ์ DROP หรือ GRANT ต่อ ระบุสิทธิ์เท่าที่ใช้จริงเท่านั้น
7. SELECT * ที่ไม่มี LIMIT (info)
ไม่ critical เท่าอันอื่น แต่บนตารางใหญ่จะทำให้ network และ memory ระเบิดเอาง่ายๆ
ลอง audit query ของ AI ดู
Scanner ด้านล่างใช้ regex จับ pattern อันตรายทั้ง 7 ตัว ลองโหลด query จากปุ่มข้างบน หรือ paste query ที่ AI เขียนให้ ตัวเองมาก็ได้ แล้วกด Scan
Checklist ก่อน copy SQL ของ AI ไปรัน
- อ่านทั้ง query ก่อน ไม่ใช่อ่านแค่บรรทัดแรก
- มี WHERE ที่ตั้งใจไหม โดยเฉพาะถ้าเป็น UPDATE หรือ DELETE
- กำลังจะรันที่ไหน staging หรือ production และใช้ DB user ที่มีสิทธิ์ระดับไหน
- SELECT ก่อนเสมอ รัน
SELECTที่ใช้ WHERE เดียวกันก่อน ดูว่ากระทบกี่ row และตรงเป้าหมายไหม - BEGIN ก่อน mutate เผื่อต้อง ROLLBACK
- Backup สดๆ ก่อนรัน ถ้าเป็น production ที่สำคัญ
สรุปทุกบทก่อนจบ
- บท 01-02 พูดเรื่อง Database vs Excel, table / row / column, และ PK / FK
- บท 03-04 สอน SELECT, WHERE, ORDER BY, LIMIT ซึ่งเป็น query พื้นฐานที่ใช้ทุกวัน
- บท 05 พูดเรื่อง JOIN ซึ่งเป็นหัวใจของ relational database
- บท 06 สอน GROUP BY, aggregate, และ HAVING สำหรับสรุปข้อมูล ออกมาเป็น insight
- บท 07 พูดเรื่อง INSERT, UPDATE, DELETE และ transaction สำหรับเปลี่ยนข้อมูลอย่างปลอดภัย
- บท 08 ก็คือบทนี้ AI Survival สำหรับตรวจ query ของ AI ก่อนรัน
จบคอร์สนี้แล้ว คุณ อ่าน SQL ออก ใช้ได้พื้นฐาน และตรวจ AI เป็น ซึ่งก็เพียงพอที่จะ
- เปิด database ของ project ตัวเองดูได้ โดยไม่กลัว
- เขียน query สำหรับ feature ส่วนใหญ่ของ app ทั่วไปได้
- review SQL ของเพื่อนร่วมทีมหรือของ AI ได้
- เข้างานจริงครั้งแรกแล้วไม่งง
ขอให้ทุกคน vibe coding กับ AI ได้อย่างสนุกและปลอดภัย