Một câu prompt rất phổ biến:
Make it secure.
Nghe hợp lý. Nhưng nó không phải security plan.
Vấn đề không phải câu đó vô dụng. Nó có thể nhắc agent thêm validation, auth guard, hoặc tránh vài lỗi rõ ràng. Nhưng nếu toàn bộ security của app dựa vào một câu prompt, bạn đang yêu cầu một model tự giới hạn chính nó trong mọi tình huống. Đó là ảo tưởng.
Security cần control nằm ngoài ý chí của agent.
Prompt là ý định, control là rào chắn
Prompt nói bạn muốn gì. Control quyết định chuyện gì được phép xảy ra.
Ví dụ:
Do not touch production database.
Đây là ý định. Control thật là:
- Agent không có production database URL.
- Token chỉ có quyền staging.
- Production command cần approval riêng.
- Backup có trước migration.
- Deploy production bị chặn nếu build/test chưa pass.
Nếu agent vẫn có credential production, prompt chỉ là lời nhắc.
Non-tech nên nhớ câu này: đừng đưa quyền rồi hy vọng prompt sẽ giữ agent ngoan.
Deterministic architecture nghe to nhưng ý rất đơn giản
NCSC dùng ý “deterministic architecture” khi nói về rủi ro AI-generated code: dùng control rõ ràng bằng rule/code/platform, thay vì kỳ vọng AI tự giới hạn AI.
Với người dùng thường, dịch ra là:
- App preview không được chạm database production.
- Secret không được nằm trong frontend.
- Repo có secret scan.
- Deploy cần build pass.
- Database có RLS/permission.
- Agent chỉ được viết trong folder cho phép.
- Cloud token chỉ có quyền cần thiết.
- Destructive action cần confirmation riêng.
Đây không phải triết lý. Đây là dây an toàn.
”Secure by default” vẫn chưa đủ
AI tool nên tạo code an toàn hơn theo mặc định. Nhưng bạn không thể chờ vendor làm mọi thứ đúng.
Ngay cả khi model được train tốt hơn, context của bạn vẫn có thể thiếu:
- Data nào là production.
- Role nào được xem field nào.
- Endpoint nào là legacy.
- Secret nào không được expose.
- Compliance rule nào áp dụng.
- User nào là tenant nào.
Model không tự biết domain boundary nếu bạn không đưa vào. Và dù có đưa vào, control vẫn cần kiểm lại.
Security prompt tốt hơn
Thay vì:
Make it secure.
Dùng:
Do not edit yet.
List security controls required before this app can handle real user data.
Separate:
- Controls already implemented
- Controls missing
- Controls that require platform configuration
- Controls that require human review
For each implemented control, point to the file or setting.
Prompt này không xin một lời hứa. Nó yêu cầu inventory.
Khi muốn sửa:
Implement only the missing control for server-side ownership check on bookings.
Do not change UI styling, schema, auth provider, or deploy config.
Afterwards show changed files and test command.
Security task cũng phải nhỏ như feature task.
Những thứ không nên giao bằng prompt rộng
Không prompt kiểu “secure everything” cho:
- Payment.
- Auth provider.
- Database migration.
- File upload privacy.
- Production deploy.
- Cloud IAM.
- Customer data export.
- Multi-tenant permission.
Các vùng này cần plan, review, và control cụ thể. Nếu agent đề xuất một diff lớn chạm nhiều vùng, yêu cầu nó tách task.
Checklist trước khi tin chữ secure
Khi agent nói “secure”, hỏi:
- Secure trước threat nào?
- Enforced ở UI, API, database, hay cloud policy?
- Có test chứng minh không?
- Có route nào chưa được bảo vệ không?
- Có secret nào trong frontend bundle không?
- Có fallback secret không?
- Preview có dùng production data không?
- Có rollback nếu deploy lỗi không?
Nếu câu trả lời chung chung, claim “secure” chưa có giá trị.
Chốt lại
“Please make it secure” là một mong muốn. Nó không phải architecture.
Vibe coding an toàn hơn khi bạn biến mong muốn thành rào chắn: permission hẹp, sandbox, secret scan, environment tách biệt, database policy, build gate, deploy gate, và review gate.
AI có thể giúp viết code secure hơn. Nhưng AI không nên là lớp bảo vệ duy nhất chống lại chính code nó viết.