+1

NodeJS Ngày 5 - Bàn về bảo mật login

Login (đăng nhập) là tính năng cơ bản của mọi ứng dụng web. Nếu đã học môn mạng máy tính hay có kiến thức an ninh mạng, hẳn bạn cũng biết các gói tin HTTP có thể dễ dàng được bắt lấy trên đường truyền mạng bởi các công cụ, ví dụ như Wireshark. Từ gói tin đó, người bắt gói tin có thể dễ dàng xem nội dung của nó. Nếu đó là gói tin của tính năng login với username và quan trọng nhất là password của người dùng thì bạn cũng biết điều tồi tệ gì sẽ xảy ra rồi nhỉ. Vì lý do đó chúng ta hãy tìm hiểu những cách bảo mật gói tin có thể áp dụng khi phát triển ứng dụng web bằng NodeJS nhé.

1. Sử dụng HTTPS bắt buộc

HTTPS là lớp bảo vệ đầu tiên và quan trọng nhất. Nó hóa toàn bộ nội dung request (bao gồm body, headers, cookies), giúp ngăn chặn nghe lén (Man-in-the-Middle) trên mạng wif công cộng. Như ở trên đã nói, nếu dùng HTTP gói tin sẽ dễ dàng bị bắt được trên mạng công cộng. Nếu dùng ở local, bạn có thể dùng mkcert để tạo chứng chỉ tạm thời.

2. Không lưu/mã hóa password phía client

Password không nên mã hóa tại client bằng JS trước khi gửi – vì JS dễ bị thao túng và không tăng bảo mật thực sự. Thay vào đó, hãy gửi thẳng password qua HTTPS, rồi backend sẽ hash password trước khi lưu trữ cũng như so sánh.

const hashed = await bcrypt.hash(password, 10);

3. Không lưu password trong log hoặc phản hồi

  • Không bao giờ ghi log req.body.password
  • Không trả lại password trong response JSON (kể cả đã băm)

4. Thêm các lớp bảo mật nâng cao (nếu cần)

Ví dụ như reCAPTCHA, 2FA / OTP (xác thực 2 yếu tố), set thời gian hết hạn cho JWT, CORS kiểm soát.

5. Sử dụng HTTP headers an toàn

Hãy lựa chọn các HTTP header như Content-Security-Policy, Strict-Transport-Security, X-Content-Type-Options... Bạn có thể áp dụng những header bằng thư viện helmet.js cho Express

npm install helmet

6. Giới hạn & kiểm soát request login

  • Giới hạn số lần đăng nhập trong 1 đơn vị thời gian bằng rate limiter như express-rate-limit.
  • Kiểm tra IP / user-agent bất thường.
  • Tạm khóa tài khoản nếu đăng nhập sai quá nhiều lần.

Trên đây là một số cách để viết tính năng Login hiệu quả hơn. Chúc các bạn học được điều mới thú vị thông qua bài viết này.

Happy coding. Nhiên.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.