Tác động
Việc không triển khai Bảo mật cấp hàng (RLS) cho phép kẻ tấn công không được xác thực truy vấn dữ liệu từ cơ sở dữ liệu Supabase khi các bảng công khai bị lộ qua ranh giới anon [S1]. Vì các ứng dụng Next.js thường hiển thị khóa Supabase anon trong mã phía máy khách nên kẻ tấn công có thể sử dụng khóa này để thực hiện lệnh gọi REST API trực tiếp tới cơ sở dữ liệu, bỏ qua logic ứng dụng dự định và truy cập thông tin người dùng nhạy cảm [S2].
Nguyên nhân gốc rễ
Theo mặc định, các bảng Postgres trong Supabase yêu cầu kích hoạt rõ ràng Bảo mật cấp hàng để ngăn truy cập công khai [S1]. Khi nhà phát triển tạo bảng nhưng quên bật RLS hoặc không xác định được các chính sách hạn chế, cơ sở dữ liệu có thể hiển thị dữ liệu cho bất kỳ ai sở hữu khóa anon của dự án, [S1]. Trong các ứng dụng Next.js, kết xuất phía máy chủ và tìm nạp phía máy khách cũng yêu cầu thiết lập máy khách Supabase cẩn thận để bối cảnh người dùng được xác thực tiếp cận lớp cơ sở dữ liệu [S2].
Sửa chữa bê tông
- Bật RLS: Thực thi
ALTER TABLE "your_table_name" ENABLE ROW LEVEL SECURITY;cho mọi bảng công khai lưu trữ dữ liệu ứng dụng [S1]. - Xác định chính sách: Tạo các chính sách cụ thể hạn chế quyền truy cập dựa trên trạng thái xác thực của người dùng, chẳng hạn như
CREATE POLICY "Users can see their own data" ON your_table_name FOR SELECT USING (auth.uid() = user_id);[S1]. - Bảo mật máy khách phía máy chủ: Khi sử dụng Next.js, hãy chỉ giữ các máy khách có vai trò dịch vụ ở máy chủ và vẫn áp dụng các bộ lọc quyền sở hữu trước khi trả lại dữ liệu cho người dùng [S2].
FixVibe kiểm tra nó như thế nào
FixVibe đã chạy kiểm tra Supabase RLS chỉ đọc thông qua baas.supabase-rls. Máy quét phát hiện URL dự án Supabase và khóa ẩn danh công khai từ các gói JavaScript cùng nguồn gốc, yêu cầu PostgREST cung cấp siêu dữ liệu bảng công khai và thử các lựa chọn chỉ đọc có giới hạn để xác nhận xem dữ liệu có bị lộ mà không có phiên người dùng hay không. Nó không chèn, cập nhật, xóa hoặc sử dụng thông tin xác thực vai trò dịch vụ. Quét kho lưu trữ cũng có thể phát hiện điều này sớm hơn thông qua repo.supabase.missing-rls, tính năng này gắn cờ các hoạt động di chuyển SQL tạo các bảng công khai không có ENABLE ROW LEVEL SECURITY.
