PlusMagi's Blog By Pitt Phunsanit Database ป้องกัน Copy Paste

ป้องกัน Copy Paste

ในโลกของการพัฒนาเว็บและระบบข้อมูลที่ต้องจัดการกับข้อมูลที่มีความอ่อนไหวสูง (Sensitive Data) การป้องกันการคัดลอกข้อมูล (Copy Paste) มักถูกเข้าใจผิดว่าสามารถแก้ไขได้ด้วยการใช้ JavaScript ในส่วนหน้าบ้าน (Frontend) เพื่อบล็อกเหตุการณ์ต่างๆ อย่างไรก็ตาม ในมุมมองของสถาปนิกระบบระดับสูง (Senior Architect) เราทราบดีว่ามาตรการเหล่านี้เป็นเพียงแค่ ‘ภาพลวงตา’ ที่สามารถถูกข้ามได้ด้วยเครื่องมือหรือโค้ดที่เหมาะสม

เมื่อพูดถึงการป้องกันข้อมูลรั่วไหลอย่างแท้จริง (Data Leakage Prevention) การควบคุมต้องเกิดขึ้นที่ระดับแกนกลางของระบบ นั่นคือ **ฐานข้อมูล (Database Layer)** เท่านั้น PostgreSQL ด้วยคุณสมบัติขั้นสูงหลายประการ จึงช่วยให้เราสามารถสร้างเกราะป้องกันข้อมูลได้ตั้งแต่ต้นทาง ก่อนที่ข้อมูลจะถูกส่งออกไปให้ผู้ใช้เห็นด้วยซ้ำ

🛡️ แนวคิด: การควบคุมข้อมูลที่ระดับ PostgreSQL

แทนที่จะพยายามบล็อกการกระทำของผู้ใช้ (ซึ่งเป็นไปไม่ได้ 100%) เราต้องเปลี่ยนแนวคิดเป็นการควบคุม ‘สิ่งที่ผู้ใช้สามารถมองเห็น’ และ ‘สิ่งที่ผู้ใช้สามารถนำออกไปได้’ PostgreSQL ช่วยให้เราดำเนินการนี้ผ่านกลไกความปลอดภัยหลัก ๆ ดังต่อไปนี้:

🔒 1. Row-Level Security (RLS): การจำกัดการมองเห็นข้อมูล

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

ตัวอย่างการใช้งาน RLS:

SQL

SQL

-- 1. เปิดใช้งาน RLS บนตาราง employees<br>ALTER TABLE employees ENABLE ROW LEVEL SECURITY;<br><br>-- 2. สร้าง Policy ให้ผู้ใช้ 'user_role' เห็นได้เฉพาะข้อมูลของตนเอง<br>CREATE POLICY user_policy ON employees FOR SELECT TO user_role<br>USING (user_id = current_user_id());<br><br>-- ผลลัพธ์: ผู้ใช้จะเห็นเฉพาะแถวที่ตรงกับเงื่อนไขนี้เท่านั้น<br>SELECT * FROM employees;<%end%>

🎭 2. Data Masking และ Views: การปกปิดข้อมูล

ในกรณีที่ผู้ใช้จำเป็นต้องเห็นข้อมูล แต่ไม่ควรเห็นข้อมูลที่อ่อนไหวบางส่วน (เช่น หมายเลขบัตรเครดิต หรือรหัสผ่าน) เราสามารถใช้ Views ร่วมกับฟังก์ชันการแปลงข้อมูล (Masking) เพื่อปกปิดข้อมูลเหล่านั้นได้

ตัวอย่างการใช้งาน Views:

SQL

SQL

-- สร้าง View ที่แสดงข้อมูลลูกค้า แต่ปกปิด 4 ตัวท้ายของบัตรเครดิต<br>CREATE VIEW masked_customer_view AS<br>SELECT<br>    customer_id,<br>    first_name,<br>    last_name,<br>    '****-****-****-' || SUBSTR(credit_card_number, -4) AS masked_card;<br><br>-- ผู้ใช้จะ Query จาก View นี้แทนตารางจริง<br>SELECT * FROM masked_customer_view;<%end%>

⚙️ 3. Stored Procedures: การควบคุมการเข้าถึงเชิงลึก

การใช้ Stored Procedures หรือ Functions ช่วยให้เราสามารถกำหนดชุดคำสั่งที่ซับซ้อนและควบคุมการไหลของข้อมูลได้ทั้งหมด ผู้ใช้จะไม่สามารถ Query ข้อมูลดิบได้โดยตรง แต่ต้องเรียกผ่าน Procedure ที่เราเขียนขึ้น ซึ่ง Procedure นั้นจะทำหน้าที่กรอง, Mask, หรือรวมข้อมูลให้เสร็จสมบูรณ์ก่อนส่งกลับไปให้ผู้ใช้

✅ สรุป: แนวคิดสถาปัตยกรรมเพื่อความปลอดภัย

การป้องกัน Copy Paste ที่สมบูรณ์แบบไม่ใช่การใช้โค้ด JavaScript แต่คือการสร้างแนวคิดด้านความปลอดภัยที่เรียกว่า **Defense in Depth** (การป้องกันหลายชั้น) โดยการย้ายจุดควบคุมความปลอดภัยจากชั้น Presentation (Frontend) ลงมาที่ชั้น Data Access (Database Layer) ด้วย PostgreSQL เครื่องมืออย่าง RLS, Views, และ Stored Procedures จะทำหน้าที่เป็นด่านสุดท้ายที่รับประกันว่า ข้อมูลที่ผู้ใช้ได้รับไปนั้น ถูกจำกัดสิทธิ์ ถูกปกปิด และไม่สามารถนำออกไปได้เกินกว่าขอบเขตที่ระบบกำหนดไว้เท่านั้น

Exit mobile version