Phỏng vấn bảo mật web cơ bản: XSS, SQL Injection, CSRF và cách phòng tránh

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Bảo mật không chỉ là việc của chuyên gia an ninh. Mọi lập trình viên web đều được kỳ vọng biết những lỗ hổng phổ biến nhất và cách tránh. Trong phỏng vấn, bạn gần như chắc chắn gặp câu hỏi về XSS, SQL Injection và CSRF. Dưới đây là cách giải thích ngắn gọn kèm ví dụ.

SQL Injection

SQL Injection xảy ra khi dữ liệu đầu vào của người dùng bị nối trực tiếp vào câu lệnh SQL, cho phép kẻ tấn công thay đổi ý nghĩa của truy vấn.

Ví dụ dễ bị tấn công

// KHÔNG làm như vậyconst sql = "SELECT * FROM users WHERE email = '" + email + "'";

Nếu email chứa dữ liệu được tạo ra để kết thúc chuỗi và thêm điều kiện luôn đúng, truy vấn có thể trả về dữ liệu ngoài ý muốn hoặc bị thay đổi.

Cách phòng tránh

// Dùng truy vấn có tham sốconst [rows] = await db.execute(  'SELECT * FROM users WHERE email = ?',  [email]);
  • Luôn dùng truy vấn tham số hóa (prepared statements) hoặc ORM đúng cách.
  • Xác thực kiểu và định dạng đầu vào.
  • Cấp cho tài khoản cơ sở dữ liệu quyền tối thiểu cần thiết.
  • Không hiển thị thông báo lỗi chi tiết của cơ sở dữ liệu cho người dùng.

XSS (Cross-Site Scripting)

XSS xảy ra khi ứng dụng hiển thị dữ liệu người dùng nhập vào trang web mà không xử lý, khiến mã JavaScript độc hại chạy trong trình duyệt của nạn nhân. Hậu quả có thể là đánh cắp phiên đăng nhập, thay đổi nội dung trang hoặc thực hiện hành động thay người dùng.

Các dạng thường gặp

  • Stored XSS: mã độc được lưu trong cơ sở dữ liệu, như trong bình luận, rồi hiển thị cho mọi người xem.
  • Reflected XSS: mã độc nằm trong URL hoặc biểu mẫu và được phản chiếu ngay trong phản hồi.
  • DOM-based XSS: lỗ hổng nằm trong code JavaScript phía trình duyệt khi xử lý dữ liệu không an toàn.

Cách phòng tránh

// Nguy hiểmelement.innerHTML = userInput;// An toàn hơnelement.textContent = userInput;
  • Mã hóa (escape) dữ liệu theo ngữ cảnh khi xuất ra HTML; các framework hiện đại như React, Blade thường làm điều này mặc định, nhưng cẩn thận với các tính năng chèn HTML thô.
  • Tránh dùng innerHTML với dữ liệu không đáng tin; nếu cần hiển thị HTML, hãy làm sạch bằng thư viện chuyên dụng.
  • Dùng Content Security Policy để giới hạn nguồn script được chạy.
  • Đặt cờ HttpOnly cho cookie phiên để mã JavaScript không đọc được.

CSRF (Cross-Site Request Forgery)

CSRF lợi dụng việc trình duyệt tự động gửi cookie xác thực kèm theo yêu cầu. Kẻ tấn công dụ nạn nhân đang đăng nhập vào trang A truy cập một trang độc hại, trang này âm thầm gửi yêu cầu đến trang A (ví dụ chuyển tiền, đổi email), và máy chủ tưởng là yêu cầu hợp lệ của người dùng.

Cách phòng tránh

  • Dùng CSRF token duy nhất cho mỗi phiên hoặc biểu mẫu và kiểm tra ở máy chủ.
  • Đặt thuộc tính SameSite cho cookie (Lax hoặc Strict) để hạn chế gửi cookie chéo trang.
  • Không thực hiện thay đổi dữ liệu bằng phương thức GET.
  • Với hành động nhạy cảm, yêu cầu xác thực lại hoặc xác nhận bổ sung.

Lưu trữ mật khẩu

Không bao giờ lưu mật khẩu dạng văn bản thường. Dùng thuật toán băm được thiết kế cho mật khẩu như bcrypt, scrypt hoặc Argon2, có muối (salt) riêng cho mỗi mật khẩu và chi phí tính toán đủ chậm để chống dò đoán hàng loạt. Không dùng các hàm băm nhanh như MD5 hay SHA-1 thuần túy cho mật khẩu.

Xác thực và quản lý phiên

  • Dùng HTTPS cho toàn bộ trang để mã hóa dữ liệu truyền đi.
  • Đặt cờ Secure, HttpOnly cho cookie phiên, tạo lại phiên sau khi đăng nhập.
  • Giới hạn số lần đăng nhập sai và cân nhắc xác thực hai yếu tố.
  • Phân quyền ở máy chủ cho mọi tài nguyên, không chỉ ẩn nút trên giao diện.

Các lỗ hổng hay bị bỏ quên

  • Kiểm soát truy cập bị hỏng: người dùng đổi mã trong URL để xem dữ liệu người khác. Luôn kiểm tra quyền sở hữu tài nguyên.
  • Lộ thông tin nhạy cảm: khóa API, mật khẩu trong mã nguồn hoặc kho Git công khai.
  • Thư viện lỗi thời: cập nhật phụ thuộc thường xuyên và theo dõi cảnh báo bảo mật.
  • Tải tệp lên không kiểm soát: kiểm tra loại và kích thước, lưu ngoài thư mục chạy được mã.

OWASP là gì?

OWASP là tổ chức phi lợi nhuận công bố tài liệu về bảo mật ứng dụng, nổi tiếng với danh sách OWASP Top 10 tổng hợp các nhóm rủi ro phổ biến nhất. Nhắc đến nó trong phỏng vấn và nói được vài mục trong danh sách cho thấy bạn quan tâm đến bảo mật một cách có hệ thống.

Cách trả lời hiệu quả

Với mỗi lỗ hổng, hãy theo thứ tự: nó là gì, tấn công hoạt động ra sao qua một ví dụ ngắn, hậu quả, và cách phòng tránh. Nếu bạn từng gặp hoặc tự sửa một lỗi tương tự trong dự án, hãy kể ngắn gọn.

Kết luận

Nguyên tắc chung là không tin dữ liệu từ phía người dùng, kiểm tra và mã hóa đầu ra, dùng các công cụ có sẵn của framework một cách đúng đắn và áp dụng quyền tối thiểu. Hãy thử tự tạo một ứng dụng nhỏ có lỗ hổng trong môi trường thử nghiệm của riêng bạn để hiểu và sửa.

Nếu bạn muốn xây nền tảng backend và web vững chắc, bao gồm cả khía cạnh bảo mật, bạn có thể tham khảo các khóa học tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment