Các cách bảo mật ứng dụng Node.js

Nếu vừa mới bắt đầu phát triển web hoặc tìm hiểu Node.js, bạn có thể chưa biết về tầm quan trọng của bảo mật ứng dụng.

Bảo mật app Node.js

Express.js cung cấp một giải pháp hiệu quả để xây dựng các ứng dụng web phụ trợ, nhưng giải pháp này lại thiếu tính bảo mật. Khi đang xây dựng một ứng dụng web, bạn cần có các biện pháp bảo mật đầy đủ để bảo vệ dữ liệu của người dùng.

Thật may, bạn có nhiều phương pháp để nâng cao bảo mật của các ứng dụng Express.js. Những mẹo sau sẽ giúp tăng cường bảo mật cho ứng dụng Node.js của bạn.

Thiết lập ứng dụng Express.js

Bắt đầu bằng cách thiết lập một server web Express.js bằng npm, trình quản lý gói Node. Tạo thư mục dự án cục bộ và thay đổi danh mục sang thư mục đó trên terminal.

mkdir express-project
cd express-project

Tiếp theo, tạo file package.json trong danh mục gốc.

npm init -y

Tiếp tục và cài Express.js.

npm install express

Cuối cùng, tạo file server.js danh mục gốc của thư mục dự án và thêm code sau để thiết lập máy chủ web cơ bản.

const express = require("express")
const app = express()
const PORT = process.env.PORT || 5000

app.get("/", (req, res) => {
    res.json("Hello, World!")
})

app.listen(PORT, () => {
    console.log(`Starting server on http://localhost:${PORT}`)
})

Khởi động server bằng lệnh này:

node server.js

Giờ bạn đã sẵn sàng khám phá một số biện pháp có thể dùng để bảo mật ứng dụng Express.js.

Bảo mật app Express.js bằng Helmet

Helmet là một middleware Node.js, giúp bảo mật app bên server bằng cách đặt các header bảo mật HTTP khác nhau. Những header này cung cấp cơ chế bảo vệ cần thiết chống lại những lỗ hổng bảo mật backend thường gặp, chẳng hạn như chèn lệnh script độc hại (XSS), tấn công giả mạo chính chủ thể (CSRF), v.v.

Bảo mật ứng dụng Node.js

Express.js mặc định không cấu hình header bảo mật HTTP, để lại một lỗi hổng bảo mật tiềm ẩn làm lộ ra header nhạy cảm. Dùng thông tin này, các tác nhân độc hại có thể chiếm quyền truy cập trái phép hoặc làm gián đoạn ứng dụng của bạn.

Helmet hoạt động như một lá chắn quan trọng, đảm bảo các phản hồi HTTP của ứng dụng thông qua những phương thức bảo mật cần thiết, giảm đáng kể vụ tấn công nguy hiểm tiềm ẩn.

Khám phá bảo mật ứng dụng Express.js mà không có Helmet

Với server đang chạy, kiểm tra header của ứng dụng. Tiếp tục và truy vấn HTTP tới API bằng Postman hoặc bất kỳ client khác hiện header phản hồi. Hầu hết trình duyệt đều bao gồm một nhóm công cụ lập trình cho phép bạn làm việc này.

Khi gửi truy vấn tới home endpoint, bạn sẽ thấy kết quả tương tự trong phần Headers của phản hồi ở Postman.

Bảo mật Node.js không Helmet

Lưu ý header X-Powered-By. Thông thường, các công nghệ backend sử dụng header này để chỉ framework hoặc phần mềm khác cung cấp năng lượng cho ứng dụng web. Bạn nên xóa thường xuyên header X-Powered-By trong môi trường sản xuất.

Bằng cách làm việc này, bạn sẽ ngăn được các vụ tấn công tiềm ẩn lấy được thông tin giá trị mà họ có thể dùng để khai thác lỗ hổng đã biết liên quan đến technology stack.

Kiểm tra cấu hình bảo mật của server Express.js

Để đánh giá trạng thái bảo mật ứng dụng, chúng ta sẽ dùng công cụ online Security Headers. App này được thiết kế nhằm đánh giá cấu hình bảo mật của header HTTP cho bên client cũng như app bên server.

Đầu tiên, bạn cần tạo server Express.js có thể truy cập qua Internet. Có hai phương pháp tiếp cận khả thi để đạt được điều này: triển khai app Express.js cho server đám mây hoặc dùng ngrok.

Để dùng nó, tải file zip ngrok, giải nén file thực thi và mở ứng dụng. Sau đó, chạy lệnh sau để host server Express.js cục bộ với ngrok.

ngrok http 5000

Ngrok sẽ xuất một số thông tin tóm tắt như sau:

Màn hình thông báo

Sao chép URL chuyển tiếp được cung cấp và dán nó vào hộp nhập của Security Headers và click nút Scan.

Sau khi đánh giá bảo mật hoàn tất, bạn sẽ nhận được một báo cáo tương tự.

Báo cáo kết quả

Dựa trên báo cáo này, server Express.js đã nhận được điểm F. Điểm thấp là kết quả của sự thiếu header bảo mật HTTP cần thiết trong cấu hình của server - sự vắng mặt của chúng khiến server dễ bị tấn công.

Tích hợp Helmet trong ứng dụng Express.js

Giờ, tiếp tục tích hợp Helmet vào ứng dụng Express.js. Chạy lệnh bên dưới để cài đặt phần phụ thuộc.

npm install helmet

Update file server.js và nhập Helmet.

const helmet = require("helmet")

Giờ thêm Helmet vào ứng dụng Express.js.

app.use(helmet())

Cuối cùng, khởi động máy chủ lập trình, sao chép liên kết chuyển tiếp từ thiết bị đầu cuối của ngrok và dán nó vào trường nhập của Security Header để quét lại máy chủ cục bộ. Khi quá trình quét lại hoàn tất, bạn sẽ thấy kết quả tương tự như sau:

Tổng quan báo cáo bảo mật

Sau khi tích hợp Helmet, Express.js bao gồm một số header bảo mật cần thiết trong phản hồi HTTP. Cải tiến đáng kể này đã khiến ứng dụng Express.js chuyển sang loại A.

Dù Helmet không phải một giải pháp hoàn hảo, nó vẫn nâng cấp đáng kể bảo mật tổng thể của ứng dụng Express.js.

Bảo mật app Express.js bằng Joi, một thư viện xác thực input

Joi là một thư viện xác thực đầu vào, giúp bảo mật app Express.js bằng cách cung cấp giải pháp xác thực và “sát trùng” đầu vào thuận tiện. Bằng cách xác định sơ đồ xác thực của Joi, bạn có thể chỉ định cấu trúc mong đợi, kiểu dữ liệu và yêu cầu với dữ liệu tới.

Joi xác thực đầu vào dựa trên sơ đồ đã xác định, đảm bảo nó đáp ứng tiêu chí cụ thể. Điều này giúp ngăn các lỗ hổng bảo mật thường gặp như chèn dữ liệu chứa mã độc, XSS và các vụ thao túng dữ liệu khác.

Hãy làm theo những bước sau để tích hợp Joi vào ứng dụng của bạn:

1. Cài đặt Joi.

npm install joi

2. Nhập Joi trong file server.js.

const Joi = require('joi');

3. Tạo sơ đồ xác thực dữ liệu Joi, định hình cấu trúc mong đợi và bất kỳ giới hạn cho dữ liệu input.

const schema = Joi.object({
  email: Joi.string().email().required(),
  password: Joi.string().min(5).max(16).required()
});

4. Xác thực tất cả dữ liệu tới bằng sơ đồ đã được xác định.

const { error, value } = schema.validate(req.body);

if (error) {
  // Xử lý lỗi xác thực
  // Ví dụ trả về một phản hồi lỗi
  return res.status(400).json({ error: error.details[0].message });
}

Bằng cách triển khai những bước này, bạn có thể dùng xác thực input của Joi để bảo mật app Express.js. Điều này đảm bảo dữ liệu tới đáp ứng điều kiện đưa ra, ngăn chặn các mối đe dọa bảo mật thao túng dữ liệu tiềm ẩn.

Trên đây là những cách phổ biến bảo mật app Node.js. Hi vọng bài viết hữu ích với các bạn.

Thứ Năm, 22/06/2023 16:34
51 👨 410
0 Bình luận
Sắp xếp theo