Security trong vibe coding không bắt đầu ở lúc app đã public. Nó bắt đầu ở prompt đầu tiên có dữ liệu thật, secret thật, file upload, database, hoặc quyền chạy command.
Một prototype cá nhân có thể chấp nhận nhiều shortcut. Nhưng shortcut phải được gọi đúng tên. Nếu bạn paste API key vào chat, để agent chạy command không hỏi, deploy app có admin page không auth, rồi share link public, đó không còn là prototype vô hại.
Bài này là checklist thực dụng. Không phải legal advice, không phải compliance framework. Mục tiêu là giúp bạn không mắc các lỗi rõ ràng khi dùng AI để dựng app nhanh.
Tách sandbox và approval policy
Hai khái niệm hay bị trộn: sandbox và approval policy.
Sandbox trả lời câu hỏi:
Agent được chạm tới đâu?
Nó có thể bị giới hạn trong một folder, một container, một cloud workspace, một branch, hoặc một môi trường không có network. Sandbox tốt làm thiệt hại bị giới hạn nếu agent làm sai.
Approval policy trả lời câu hỏi:
Agent làm việc gì phải hỏi trước?
Ví dụ: sửa file có thể tự động, nhưng install dependency phải hỏi; chạy test được tự động, nhưng deploy phải hỏi; đọc file được tự động, nhưng xoá database phải hỏi.
Bạn cần cả hai. Sandbox mà approval lỏng vẫn nguy hiểm nếu sandbox chứa secret hoặc production data. Approval chặt nhưng không sandbox vẫn nguy hiểm nếu một lệnh được approve nhầm có thể xoá nhiều thứ.
Prompt an toàn:
Work only inside this project.
Ask before installing dependencies, changing database schema, deleting files, running migrations, or deploying.
Do not access production systems.
Network access không phải chi tiết nhỏ
Nếu agent có network, nó có thể tải package, gọi API, gửi request ra ngoài, đọc docs, hoặc tương tác service. Đây là quyền mạnh.
Trước khi bật network, hỏi:
- Agent cần network để làm gì?
- Nó sẽ gọi domain nào?
- Có gửi dữ liệu user ra ngoài không?
- Có thể làm offline với docs/code hiện có không?
- Request có dùng secret không?
Với app nhỏ, network access thường cần để install package hoặc gọi API test. Nhưng đừng để network mở mà không biết outbound call mới nằm đâu trong code.
Sau khi agent sửa, search network call:
fetch(
axios
webhook
apiKey
Authorization
Yêu cầu summary:
List every external service this app now calls.
For each one, list data sent and where credentials are stored.
Nếu agent thêm analytics, email, AI API, storage, payment, hoặc webhook mà bạn không yêu cầu, đó là thay đổi cần review.
Secret không nằm trong chat và source code
Rule đơn giản:
- Không paste production secret vào prompt.
- Không hardcode secret trong code.
- Không commit
.envthật. - Không log secret.
- Không screenshot secret rồi gửi vào chat.
Secret nên nằm trong secret manager, hosting provider env vars, hoặc file .env.local đã gitignore. Repo có thể có .env.example với placeholder:
DATABASE_URL=
STRIPE_SECRET_KEY=
EMAIL_API_KEY=
Không có giá trị thật.
Nếu agent nói “paste your API key here”, hãy đổi hướng:
Use an environment variable named EMAIL_API_KEY.
Update .env.example with the variable name only.
Do not include the real key in code, docs, logs, or chat.
Nếu bạn lỡ paste secret vào chat hoặc commit, coi như secret đã lộ. Rotate key. Đừng chỉ xoá dòng trong commit mới rồi tự an ủi.
Destructive action phải có confirmation riêng
Destructive action là hành động có thể xoá, ghi đè, migrate, deploy, gửi thật, hoặc thay đổi resource thật. Ví dụ:
- Delete records.
- Drop table.
- Run migration.
- Reset database.
- Delete files.
- Remove storage bucket/object.
- Send email/SMS to real users.
- Charge/refund payment.
- Deploy production.
- Change DNS/env config.
Agent không nên tự làm các bước này chỉ vì nằm trong task chung. Cần confirmation riêng và cụ thể.
Prompt:
Do not run destructive commands.
If a destructive step seems necessary, stop and explain:
- exact command/action
- why it is needed
- expected impact
- rollback plan
Đừng approve theo kiểu “ok do it” nếu bạn chưa đọc command. Với database, càng phải đọc kỹ.
Logs và prompts có thể chứa dữ liệu nhạy cảm
Khi debug, người ta hay dán log. Log có thể chứa email, phone, address, token, cookie, signed URL, payload booking, message người dùng, hoặc stack trace kèm env.
Trước khi gửi cho AI:
- Xoá token/cookie/authorization header.
- Mask email/phone nếu không cần.
- Xoá database URL.
- Xoá payment/customer id nếu không cần.
- Chỉ giữ error message, timestamp, endpoint, stack trace cần thiết.
Ví dụ thay vì:
Authorization: Bearer sk_live_...
email: [email protected]
Dùng:
Authorization: [REDACTED]
email: [REDACTED_EMAIL]
Agent vẫn có thể phân tích lỗi mà không cần secret thật.
Auth không được làm bằng UI hide
Một lỗi phổ biến trong vibe coding: agent ẩn nút admin nếu user không phải admin, rồi coi như xong. Không đủ. UI hide chỉ là trải nghiệm. Security phải nằm ở server/API/database rule.
Checklist auth:
- Route admin yêu cầu login.
- API admin check role server-side.
- User chỉ đọc/sửa data của mình.
- Export data có permission check.
- File download không public ngoài ý muốn.
- Role không thể đổi từ client.
Nếu app chưa có auth nhưng có dữ liệu nhạy cảm, đừng public. Nếu chỉ là demo, ghi rõ demo và dùng data giả.
File upload là cửa rộng
Upload ảnh, PDF, CSV nhìn nhỏ nhưng risk nhiều. Tối thiểu cần:
- Giới hạn file size.
- Giới hạn file type.
- Không trust filename.
- Không execute uploaded file.
- Storage path không đè file người khác.
- Public/private access rõ.
- Error handling khi upload fail.
Với CSV import, cần thêm validation dòng, giới hạn số dòng, preview trước khi import, và không ghi đè data thật nếu user chưa confirm. Vibe coding hay làm import/export rất nhanh, nhưng phần nguy hiểm nằm ở dữ liệu hỏng hoặc ghi nhầm.
Checklist trước khi share app public
Trước khi gửi link cho người ngoài, chạy checklist ngắn:
No real secrets in code, chat, screenshots, or logs.
.env files are not tracked.
.env.example contains placeholders only.
Admin/private routes require auth.
Server/API checks ownership and roles.
No destructive action can run without explicit confirmation.
External services and payloads are known.
File upload has size/type limits.
Database migrations are reviewed.
Debug logs are removed.
Mock/demo data is clearly labeled or removed.
Rollback path exists.
Nếu chưa tick được hết, app có thể vẫn share nội bộ với cảnh báo. Nhưng đừng gọi nó public-ready.
Chốt lại
Security của vibe coding là boundary management. Agent được chạy ở đâu, được gọi network nào, được cầm secret nào, được làm gì không cần hỏi, và khi nào phải dừng.
Đừng chờ tới lúc app có user thật mới nghĩ về sandbox, approval, secret, destructive action. Ngay từ prototype, hãy tập thói quen: secret ở env, destructive action phải hỏi, network call phải biết, log phải sạch, auth phải ở server, rollback phải có. Tốc độ của vibe coding chỉ có ích khi bạn còn giữ quyền quyết định những thứ có thể gây thiệt hại thật.