Open redirect là khi ứng dụng nhận URL đích từ tham số của user rồi chuyển hướng tới đó mà không kiểm tra.
GET /login?returnUrl=https://evil.example/loginSau khi đăng nhập, hệ thống đẩy user sang trang giả mạo. Người dùng thấy link bắt đầu bằng domain thật của bạn nên tin tưởng bấm.
Vì sao nguy hiểm hơn vẻ ngoài:
- Mượn uy tín domain để phishing, và qua được bộ lọc link của email/chat.
- Rò rỉ thông tin qua Referer khi trang đích ghi lại.
- Nếu redirect nằm trong luồng OAuth (redirect_uri), kẻ tấn công có thể nhận được authorization code hoặc token.
Cách chặn:
1. Tốt nhất là không nhận URL đầy đủ. Nhận một khoá và tra bảng: ?next=dashboard → /dashboard.
2. Nếu buộc phải nhận đường dẫn, chỉ chấp nhận relative path:
function safeNext(next) {
// reject absolute URLs and protocol-relative //evil.com
if (!next.startsWith('/') || next.startsWith('//')) return '/'
return next
}3. Nếu thật sự cần đi ra ngoài, dùng allowlist domain so khớp bằng new URL(...).host (so khớp đúng host), không dùng startsWith hay includes — https://your-site.com.evil.example sẽ lọt.
4. Với OAuth: redirect_uri phải khớp chính xác giá trị đã đăng ký, không so khớp prefix.