Computer >> Hướng Dẫn Máy Tính >  >> Kết Nối Mạng >> An Ninh Mạng

CSRF (Cross-Site Request Forgery) là gì? Cơ chế tấn công, ví dụ và biện pháp phòng chống

CSRF là gì?

Cross-Site Request Forgery (CSRF/XSRF/Sea Surf/Session Riding) là tấn công ép người dùng đã xác thực (logged in) thực hiện hành động không mong muốn trên ứng dụng web mà họ đang đăng nhập.

Cơ chế hoạt động

  1. User đăng nhập vào bank.com → Có session cookie hợp lệ
  2. Kẻ tấn công dụ user truy cập evil.com (qua email, link, quảng cáo)
  3. evil.com chứa form/script tự động gửi request đến bank.com/transfer
  4. Trình duyệt tự động gửi kèm cookie session của bank.com
  5. bank.com xử lý request như user hợp pháp → Chuyển tiền, đổi pass, xóa tài khoản...

Ví dụ thực tế

<!-- Trang evil.com -->
<form action="https://bank.com/transfer" method="POST">
  <input type="hidden" name="to_account" value="attacker_account">
  <input type="hidden" name="amount" value="1000000">
</form>
<script>document.forms[0].submit();</script>

User chỉ cần truy cập evil.com → Tiền bị chuyển đi mà không hay biết.

Đặc điểm quan trọng

  • Tấn công thay đổi trạng thái (State-changing): Chuyển tiền, đổi pass, xóa dữ liệu, vote, like...
  • KHÔNG đánh cắp dữ liệu (không đọc được response do Same-Origin Policy)
  • Khai thác sự tin tưởng của server vào browser (browser tự gửi cookie)

Biện pháp phòng chống (Từ yếu đến mạnh)

1. CSRF Token (Khuyên dùng - Stateful)

  • Server tạo token ngẫu nhiên duy nhất cho mỗi session/form
  • Nhúng token vào form ẩn: <input type="hidden" name="csrf_token" value="abc123...">
  • Server verify token khi nhận request → Từ chối nếu thiếu/sai
  • Framework hỗ trợ sẵn: Django, Laravel, Spring Security, .NET Core, Express (csurf)

2. Double Submit Cookie (Stateless)

  • Server set cookie: csrf_token=random_value (HttpOnly=false, SameSite=Lax/Strict)
  • Client đọc cookie qua JS → Gửi kèm trong header: X-CSRF-Token: random_value
  • Server so sánh cookie vs header → Khớp thì chấp nhận
  • Phù hợp SPA (Single Page App), REST API

3. SameSite Cookie Attribute (Hiện đại, hiệu quả)

  • Set-Cookie: sessionid=...; SameSite=Strict: Không gửi cookie cross-site (an toàn nhất, có thể phá UX)
  • SameSite=Lax: Gửi cookie khi link navigation (GET), không gửi khi POST form cross-site (cân bằng)
  • SameSite=None; Secure: Cho phép cross-site (cần cho OAuth, embed) → BẮT BUỘC có CSRF token khác

4. Biện pháp bổ sung

  • Yêu cầu xác thực lại (Re-authentication) cho hành động nhạy cảm: đổi pass, chuyển tiền, xóa tài khoản
  • One-time token (OTP) cho giao dịch quan trọng
  • Kiểm tra Header Origin và Referer (có thể bị strip bởi proxy/privacy tools)
  • CAPTCHA cho form quan trọng

HTTPS có ngăn chặn CSRF không?

KHÔNG. HTTPS chỉ mã hóa truyền tải. CSRF khai thác cơ chế gửi cookie tự động của browser - hoàn toàn hoạt động trên HTTPS.

Best Practice tóm gọn

  1. Dùng CSRF protection built-in của framework
  2. Stateful app: Synchronizer Token Pattern
  3. Stateless/SPA: Double Submit Cookie + SameSite=Lax
  4. Hành động nhạy cảm: Re-auth + OTP
  5. Set SameSite=Lax/Strict cho mọi session cookie