Mở đăng ký khóa học Fullstack qua Zoom. Tham khảo tại đây

Thư Viện Câu Hỏi Phỏng Vấn

Tổng hợp các câu hỏi tuyển dụng thực tế theo nhiều cấp độ từ Entry đến Expert để bạn tự tin chinh phục nhà tuyển dụng.

Interactive Practice Tổng cộng 4,442 câu hỏi độc bản

Luyện Tập Phỏng Vấn Thử

Mô phỏng áp lực phỏng vấn thật với đồng hồ đếm ngược từng câu, tự đánh giá phản xạ và đo lường độ sẵn sàng của bạn.

Vui lòng đăng nhập để tham gia luyện tập và lưu tiến độ phỏng vấn.
901

Làm thế nào để phòng chống lỗ hổng Cross-Site Scripting (XSS) trong các ứng dụng Web hiện đại sử dụng các framework như React hoặc Vue?

Junior

Bản chất lỗ hổng XSS

Cross-Site Scripting (XSS) xảy ra khi ứng dụng web cho phép kẻ tấn công chèn các mã độc (thường là JavaScript) vào trang web được hiển thị cho những người dùng khác. Mã độc này có thể đánh cắp Session Cookie, Token xác thực hoặc thực hiện các hành động mạo danh người dùng.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
902

Lỗ hổng Cross-Site Request Forgery (CSRF) là gì và tại sao việc sử dụng SameSite Cookie lại là phương pháp hiệu quả để ngăn chặn?

Junior

Bản chất lỗ hổng CSRF

Cross-Site Request Forgery (CSRF) là cuộc tấn công mà kẻ tấn công lừa người dùng đã đăng nhập thực hiện các hành động không mong muốn trên một ứng dụng web mà họ đang có phiên làm việc hợp lệ. Kẻ tấn công lợi dụng việc trình duyệt tự động đính kèm Cookie xác thực vào mọi HTTP request gửi đến server đích, bất kể request đó bắt nguồn từ đâu.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
903

Tại sao việc sử dụng Prepared Statements lại là tiêu chuẩn vàng để ngăn chặn lỗ hổng SQL Injection thay vì chỉ dựa vào việc lọc chuỗi ký tự?

Junior

Bản chất lỗ hổng SQL Injection

SQL Injection (SQLi) xảy ra khi ứng dụng web nhận dữ liệu đầu vào từ người dùng và trực tiếp nối (concatenation) vào câu lệnh truy vấn SQL mà không qua kiểm tra hoặc xử lý biên dịch đúng đắn. Kẻ tấn công có thể thao túng cấu trúc câu lệnh SQL để truy xuất, chỉnh sửa hoặc xóa toàn bộ cơ sở dữ liệu.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
904

Phân biệt sự khác nhau giữa CORS (Cross-Origin Resource Sharing) và các cơ chế bảo mật phía Server, và việc cấu hình CORS sai lầm dẫn đến rủi ro gì?

Junior

Bản chất của CORS

CORS (Cross-Origin Resource Sharing) là một cơ chế bảo mật của trình duyệt (Browser security mechanism) dựa trên Same-Origin Policy. Nó cho phép một trang web từ một nguồn (origin) này có thể yêu cầu tài nguyên từ một nguồn khác khác tên miền, cổng hoặc giao thức.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
905

Tại sao việc kiểm soát phân quyền dựa trên đối tượng (Insecure Direct Object References - IDOR) lại nguy hiểm trong các ứng dụng Enterprise và cách khắc phục?

Junior

Bản chất lỗ hổng IDOR

Insecure Direct Object References (IDOR) xảy ra khi ứng dụng sử dụng các tham số định danh trực tiếp từ phía người dùng (như ID tài khoản, mã hóa đơn, tên file) để truy xuất dữ liệu nội bộ mà không thực hiện kiểm tra xem người dùng hiện tại có quyền sở hữu hoặc quyền truy cập đối tượng đó hay không.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
906

Trong lập trình hướng đối tượng, tại sao việc khởi tạo quá nhiều thuộc tính trong constructor lại là một dấu hiệu xấu về thiết kế (Anti-pattern) và cách khắc phục như thế nào?

Junior

Bản chất vấn đề

Khi một class có constructor nhận vào quá nhiều tham số (thường từ 5 tham số trở lên), đây là dấu hiệu của lỗi thiết kế được gọi là Telescoping Constructor Anti-pattern hoặc class đang vi phạm Single Responsibility Principle (SRP). Điều này làm cho việc khởi tạo đối tượng trở nên khó đọc, dễ truyền nhầm thứ tự các tham số và khó bảo trì khi class thay đổi cấu trúc.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
907

Sự khác biệt cốt lõi giữa tính đóng gói (Encapsulation) và tính ẩn thông tin (Information Hiding) trong lập trình hướng đối tượng là gì?

Junior

Bản chất vấn đề

Nhiều lập trình viên cấp độ Junior thường nhầm lẫn hoặc đánh đồng giữa tính đóng gói (Encapsulation) và ẩn thông tin (Information Hiding), mặc dù chúng có ý nghĩa và mục đích bổ trợ khác nhau trong thiết kế hệ thống.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
908

Tại sao việc lạm dụng từ khóa static trong lập trình hướng đối tượng lại vi phạm các nguyên lý thiết kế và gây khó khăn cho việc kiểm thử tự động (Unit Test)?

Junior

Bản chất vấn đề

Từ khóa static gắn liền với phạm vi lớp (Class-level) thay vì phạm vi thể hiện (Instance-level). Khi một phương thức hoặc thuộc tính được khai báo là static, nó tồn tại duy nhất trong suốt vòng đời của ứng dụng và được chia sẻ toàn cục.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
909

Làm thế nào để phân biệt khi nào nên sử dụng Interface và khi nào nên sử dụng Abstract Class trong thiết kế hệ thống hướng đối tượng?

Junior

Bản chất vấn đề

Đây là câu hỏi kinh điển trong phỏng vấn Junior. Cả Interface và Abstract Class đều dùng để đạt được tính trừu tượng (Abstraction), nhưng chúng phục vụ các mục đích thiết kế kiến trúc hoàn toàn khác nhau.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
910

Trong lập trình hướng đối tượng, tại sao nguyên lý Single Responsibility Principle (SRP) lại giúp giảm thiểu xung đột mã nguồn (Merge Conflicts) khi làm việc nhóm?

Junior

Bản chất vấn đề

Single Responsibility Principle (SRP) phát biểu rằng: "Một class chỉ nên có duy nhất một lý do để thay đổi". Nghĩa là mỗi class chỉ nên đảm nhận một nhiệm vụ hoặc chức năng duy nhất trong hệ thống.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
911

Trong môi trường phát triển NodeJS, sự khác biệt cụ thể giữa chế độ cài đặt Global và Local packages là gì và khi nào một Junior Developer nên sử dụng từng chế độ này?

Junior

Bản chất cơ chế hoạt động

  • Cài đặt Local (Cục bộ): Các gói thư viện được tải xuống và lưu trữ trực tiếp trong thư mục node_modules của dự án hiện tại. Tệp package.json và package-lock.json sẽ ghi nhận các phụ thuộc này. Đây là cách tiếp cận tiêu chuẩn cho hầu hết các thư viện mã nguồn và công cụ phụ thuộc trực tiếp vào mã nguồn của ứng dụng.
  • Cài đặt Global (Toàn cục): Các gói thư viện được cài đặt vào một thư mục chung của hệ thống điều hành (ví dụ: /usr/local/lib/node_modules trên macOS/Linux hoặc thư mục AppData trên Windows). Các gói này thường là các dòng lệnh thực thi (CLI tools) dùng chung cho nhiều dự án khác nhau như create-react-app, nodemon, hoặc typescript.

Khi nào nên sử dụng từng chế độ

  • Sử dụng Local: Cho tất cả các dependency và devDependency liên quan trực tiếp đến dự án để đảm bảo tính nhất quán giữa các môi trường phát triển của các lập trình viên khác nhau và trên hệ thống CI/CD.
  • Sử dụng Global: Chỉ dành cho các công cụ dòng lệnh (CLI tools) hỗ trợ quá trình phát triển mà không gắn kết mã nguồn với logic nghiệp vụ của ứng dụng cụ thể.

Ví dụ minh họa

Cài đặt công cụ chạy lại server tự động dưới dạng Local devDependency thay vì Global:

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
912

Tại sao việc thực thi lệnh npm prune lại quan trọng trong các môi trường triển khai Production và nó khác biệt như thế nào so với việc chạy npm install thông thường?

Junior

Bản chất cơ chế hoạt động

  • npm install thông thường: Khi chạy trên môi trường Production, nếu cấu hình thiếu cờ định hướng, npm có thể cài đặt cả các gói nằm trong mục devDependencies (các công cụ chỉ dùng cho việc phát triển và kiểm thử như Jest, ESLint, Webpack).
  • npm prune: Lệnh này có nhiệm vụ quét tệp package.json và thư mục node_modules hiện tại, sau đó tiến hành gỡ bỏ hoàn toàn bất kỳ gói thư viện nào không được liệt kê trong phần dependencies của tệp cấu hình.

Tác động đến hiệu năng và bảo mật

  • Giảm dung lượng hình ảnh Docker (Docker Image Size): Việc loại bỏ các devDependencies giúp thu gọn đáng kể kích thước gói triển khai, tối ưu hóa tốc độ đẩy và kéo image trên các registry.
  • Tăng cường bảo mật: Giảm thiểu bề mặt tấn công (attack surface) bằng cách loại bỏ các thư viện kiểm thử hoặc công cụ biên dịch không cần thiết có thể chứa các lỗ hổng bảo mật tiềm ẩn trên môi trường Production.

Ví dụ minh họa quy trình CI/CD chuẩn

npm ci --omit=dev
npm prune

Lưu ý kinh nghiệm thực chiến

Trong các pipeline CI/CD hiện đại, thay vì dùng npm install kèm theo npm prune, các lập trình viên nên sử dụng trực tiếp lệnh npm ci --omit=dev để tự động bỏ qua toàn bộ devDependencies ngay từ bước cài đặt ban đầu, giúp tiết kiệm thời gian và đảm bảo độ sạch sẽ cho thư mục node_modules.

913

Làm thế nào để xử lý tình trạng lỗi EACCES (Permission Denied) khi thực hiện cài đặt các gói NPM toàn cục mà không cần phải sử dụng quyền root (sudo) trên hệ thống Linux hoặc macOS?

Junior

Bản chất nguyên nhân lỗi

Lỗi EACCES xảy ra khi tài khoản người dùng hiện tại không có quyền ghi (write permissions) vào thư mục cài đặt global mặc định của NodeJS (thường thuộc quyền sở hữu của người dùng root). Việc sử dụng lệnh sudo npm install -g để khắc phục là một thói quen nguy hiểm vì nó làm thay đổi quyền sở hữu của các tệp cấu hình hệ thống và có thể tạo ra các lỗ hổng bảo mật nghiêm trọng.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
914

Sự khác biệt cốt lõi giữa lệnh npm install và npm ci là gì, và tại sao các kỹ sư phần mềm luôn được khuyến nghị sử dụng npm ci trong môi trường CI/CD?

Junior

Bản chất cơ chế hoạt động

  • npm install: Được thiết kế dành cho môi trường phát triển cục bộ (local development). Lệnh này có khả năng tự động cập nhật tệp package-lock.json nếu phát hiện thấy sự không khớp nhẹ, đồng thời phân tích cú pháp cây phụ thuộc và có thể thực hiện các thuật toán giải quyết phiên bản động.
  • npm ci (Clean Install): Được thiết kế chuyên biệt cho các môi trường tự động hóa như CI/CD pipelines. Lệnh này yêu cầu sự tồn tại bắt buộc của tệp package-lock.json. Nó sẽ xóa sạch thư mục node_modules hiện có trước khi cài đặt và tiến hành cài đặt chính xác từng phiên bản gói được khóa trong tệp lock file mà không thực hiện bất kỳ sự thay đổi nào đối với tệp này.

Các tiêu chí so sánh chuyên sâu

  1. Tốc độ: npm ci thường nhanh hơn đáng kể trong môi trường CI vì nó bỏ qua các bước phân tích cây phụ thuộc phức tạp.
  2. Tính toàn vẹn (Determinism): npm ci đảm bảo 100% rằng mọi môi trường từ máy cá nhân đến máy chủ Production đều chạy đúng một phiên bản mã nguồn và dependencies giống hệt nhau, ngăn chặn triệt để lỗi 'trên máy tôi chạy bình thường'.

Ví dụ minh họa trong tệp cấu hình GitHub Actions

- name: Install dependencies
  run: npm ci

Lưu ý kinh nghiệm thực chiến

Nếu tệp package.json và tệp package-lock.json không đồng bộ với nhau, lệnh npm ci sẽ lập tức báo lỗi và dừng quá trình xây dựng. Đây là cơ chế bảo vệ cực kỳ quan trọng giúp đội ngũ phát hiện sớm các thay đổi chưa được đồng bộ hóa trong mã nguồn.

915

Nghĩa vụ và cách thức hoạt động của lệnh npm init so với việc tạo thủ công tệp package.json trong một dự án phần mềm mới là gì?

Junior

Bản chất cơ chế hoạt động

  • npm init: Là một tiện ích dòng lệnh tương tác giúp lập trình viên khởi tạo một dự án NodeJS mới bằng cách sinh ra tệp package.json thông qua các câu hỏi cấu hình cơ bản (tên dự án, phiên bản, mô tả, tệp điểm vào entry point, tác giả, giấy phép).
  • Khởi tạo thủ công: Lập trình viên tự tạo một tệp package.json trống và tự viết các thuộc tính JSON bằng tay.

Các trường dữ liệu bắt buộc chuẩn Enterprise trong package.json

Khi khởi tạo, một tệp package.json chuẩn mực cần đảm bảo các trường tối thiểu sau để phục vụ cho việc quản lý và kiểm tra:

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
High-Ticket Mentoring
Cần Mentor Phỏng Vấn Thử 1-1 & Tối Ưu CV?

Mô phỏng phỏng vấn kỹ thuật thực tế 1-1 qua Google Meet, nhận xét chi tiết điểm mạnh/yếu và sửa CV trực tiếp cùng giảng viên Unicode.

AI Resume Scanner
Kiểm Tra CV Chuẩn ATS Miễn Phí

Tải CV của bạn lên để hệ thống AI rà soát từ khóa kỹ năng, định dạng và tính điểm chuẩn nhà tuyển dụng.

vừa nâng cấp PRO khóa 1 phút trước   Tìm hiểu khóa học