Các phương pháp để bảo mật ứng dụng NodeJS – Phần 2

4 min


1068
1.7k shares, 1068 points

Lời giới thiệu

Để tiếp tục phần 1 : Các phương pháp để bảo mật ứng dụng NodeJS – Phần 1

Trong phần này, tôi sẽ liệt kê thêm những cách bảo mật NodeJS

Ngăn chặn các cuộc tấn công Injection SQL (SQLi)

Việc chuyển trực tiếp input của người dùng chưa được xác thực vào một câu lệnh SQL dễ bị tấn công SQL injection.

Hãy xem xét ví dụ sau:

// SQL query vulnerable to SQLi
sql = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";// Execute the SQL statement
database.execute(sql)

Bây giờ, giả sử người dùng nhập thông tin sau vào trường tên người dùng:

' OR '1'='1' --

Câu lệnh SQL trên trở thành:

sql = "SELECT * FROM users WHERE username='" + ' OR 1=1 -- + "' AND password='" + password + "'";

Điều này vô hiệu hóa hiệu quả sự cần thiết của mật khẩu và trả về tất cả người dùng trong cơ sở dữ liệu.

Cuộc tấn công này có thể được ngăn chặn hoàn toàn bằng cách sử dụng câu lệnh được chuẩn bị hoặc tham số hóa.

Nếu bạn đang sử dụng ORM để truy cập cơ sở dữ liệu (Mongoose, Sequelize, v.v.). ORM thường sẽ xử lý việc chèn SQL bằng cách sử dụng các câu lệnh đã chuẩn bị sẵn.

Bảo mật cookie bằng cờ cookie

Lỗ hổng XSS trong một ứng dụng có thể được sử dụng để lấy cắp cookie của trình duyệt. Để ngăn chặn việc đánh cắp cookie, chúng ta có thể đặt cờ httpOnly của cookie trong NodeJS.

Chúng ta có thể yêu cầu trình duyệt chỉ gửi cookie qua HTTPS bằng cách sử dụng cờ an toàn.

secure : thuộc tính này yêu cầu trình duyệt chỉ gửi cookie nếu request được gửi qua HTTPS.

HttpOnly : thuộc tính này được sử dụng để giúp ngăn chặn các cuộc tấn công chẳng hạn như tập lệnh trên nhiều trang web. Vì nó không cho phép cookie được truy cập thông qua NodeJS.

Ví dụ:

app.use(session({
 secret: ‘My super secret’,
 cookie: { httpOnly: true, secure: true }
}));

Ngăn chặn bạo lực và tấn công DoS

Để ngăn trang web của chúng ta quá tải với một số lượng lớn request. Chúng ta cần đặt một số loại giới hạn tốc độ cho API NodeJS của chúng ta.

Tham khảo thêm về API tại đây : 10 cách để viết restful api NodeJS chuẩn cơm mẹ nấu luôn

Chúng ta có thể sử dụng package npm ratelimiter để thực hiện giới hạn tốc độ. Nếu bạn đang sử dụng Express, middleware express-rate-limit có thể được sử dụng như hình dưới đây:

const RateLimit = require('express-rate-limit');
const limiter = new RateLimit({
  windowMs: 15*60*1000, // 15 minutes
  max: 100, // limit each IP to 100 requests per windowMs
  delayMs: 0 // disable delaying — full speed until the max limit is  reached
});
// apply to all requests
app.use(limiter);

Error Handling

Mọi error trong ứng dụng sẽ được xử lý một cách khéo léo bằng cách hiển thị error tùy chỉnh cho người dùng. Thay vì hiển thị lỗi mặc định do đó làm rò rỉ thông tin cơ sở hạ tầng nhạy cảm như thông tin server NodeJS.

Tham khảo thêm về xử lý các error tại đây : Bí quyết xử lý và cải thiện về error trên NodeJS

Tools

The Node Security Project

Để kiểm tra các mô-đun npm khác nhau để tìm các lỗ hổng đã biết. Node Security Project cung cấp công cụ nsp để kiểm tra các lỗ hổng:

nsp check

Synk

Synk kiểm tra ứng dụng dựa trên cơ sở dữ liệu lỗ hổng nguồn mở của Snyk để tìm bất kỳ lỗ hổng đã biết nào trong các phần phụ thuộc của chúng ta vơí app NodeJS.

npm install -g snyk
cd your-app
snyk test

nmap

Nmap (“Network Mapper”) là một tiện ích nguồn mở và miễn phí để khám phá mạng hoặc kiểm tra bảo mật.

sqlmap

sqlmap là một công cụ kiểm tra code nguồn mở tự động hóa quá trình phát hiện và khai thác các lỗ hổng SQL injection và tiếp quản các servers cơ sở dữ liệu.

Burp Suite

Công cụ phải có để kiểm tra thâm nhập ứng dụng. Nó bao gồm một máy quét tự động để phát hiện hầu hết các lỗ hổng phổ biến trong một ứng dụng web.

Kết luận

Qua bài viết này, bạn đã biết thêm các cách bảo mật như sử dụng cookie hiệu quả , …web NodeJS. Hãy tiếp tục theo dõi để tìm hiểu thêm nhiều cách hơn nữa tại trang nhé

Tham khảo thêm về NodeJS: Xây dựng dashboard theo dõi COVID live bằng NodeJS


Like it? Share with your friends!

1068
1.7k shares, 1068 points

What's Your Reaction?

hate hate
0
hate
confused confused
2
confused
fail fail
0
fail
fun fun
0
fun
geeky geeky
0
geeky
love love
0
love
lol lol
0
lol
omg omg
1
omg
win win
2
win