Bảo mật
Chuẩn bảo mật bắt buộc của PhoStack. Ngắn — vì mọi quy tắc ở đây đều không có ngoại lệ.
Cập nhật lần cuối: 29/07/2026
Thanh toán
- Verify chữ ký trước mọi thứ. Payload IPN chưa verify là dữ liệu thù địch. So sánh hash bằng
crypto.timingSafeEqual(chống timing attack) — xemvnpay.tslàm mẫu. - Đối chiếu số tiền.
amountVndtừ IPN phải khớp với Order trong DB — không tin số tiền cổng báo để "cập nhật" đơn. - Idempotency theo
gatewayTxnId— chống double-credit khi IPN retry.
Secret
- Secret chỉ sống trong env, đọc qua
src/lib/env.ts. Không hardcode, không log, không trả về client. .envnằm trong.gitignore; chỉ commit.env.examplevới giá trị rỗng/placeholder.AUTH_SECRETtối thiểu 16 ký tự (Zod enforce) — sinh bằngopenssl rand -base64 32.
Auth & phân quyền
- Password hash bằng bcrypt (bcryptjs), không bao giờ lưu plaintext.
- Mọi query dữ liệu theo user phải scope theo session user id — chống IDOR. Không bao giờ nhận user id từ client làm khoá truy vấn dữ liệu nhạy cảm.
- Route handler mutation kiểm tra session trước khi làm bất cứ gì.
Báo cáo lỗ hổng
Khách hàng phát hiện lỗ hổng: gửi hello@phostack.com — không mở GitHub Issue công khai. Sửa và phát hành trong chu kỳ update sớm nhất.