Chúng ta sẽ giới hạn số lượng request (trên 1 địa chỉ IP trong một khoảng thời gian nhất định) để đề phòng server Node của chúng ta lăn ra chết khi phải hứng chịu các cuộc tấn công từ chối dịch vụ (DOS, DDOS). Việc implement cũng không hề khó nhọc một chút nào với việc dùng cách package npm có sẵn.
|
Ở ví dụ trên chúng ta chỉ cần cài đặt package express-rate-limit” và config cấu hình cho middleware để lọc các request. Ở trên chúng ta chỉ cho phép 1 địa chỉ IP request tối đa 100 lần trong vòng 15 phút. Nếu vượt quá giới hạn nói trên, server ngay lập tức sẽ trả về status code 429 TOO MANY REQUESTS.
Chúng ta có thể cài đặt số lượng request tôi đa với mỗi routes là khác nhau.
|
Đừng bao giờ tin dữ liệu người dùng nhập vào, lọc dữ liệu ở phía client chỉ có tác dụng với người dùng thông thường.
Các lỗ hổng nổi tiếng và rất nguy hiểm khai thác sự hớ hênh trên không thể không kể đến XSS, SQL Injection, …
Helmet là một package npm, gồm 14 middleware nhỏ ở trong giúp xử lý, lọc các HTTP header độc hại (nhằm khai thác lỗ hổng XSS hay clickjacking, …).
const express = require(‘express’) const helmet = require(‘helmet’) const app = express() app.use(helmet()) |
Các tùy chọn mặc định của Helmet khi sử dụng câu lệnh app.use(helmet()). Nếu muốn bạn có thể lựa thêm nhiều tùy chọn, chi tiết bạn có thể tham khảo ở Github.
Giá trị dữ liệu mà người dùng submit form lên server hoàn toàn có thể là chuỗi rỗng, không đủ độ dài, hay chứa các đoạn mã nguy hiểm (ký tự đặc biệt, ..).
|
Ở ví dụ trên, req.body.username và req.body.password sẽ được kiểm tra xem có rổng hay không (password thì thêm điều kiện ít nhất 6 ký tự) cũng với đọc lại lọc, chuyển đổi các ký tự đặc biệt có thể ẩn tàng là 1 đoạn mã khai thác. Server sẽ trả về status code 422 nếu dữ liệu không thỏa mãn điều kiện.
Chúng ta cũng có thể dùng check thay vì body, hàm check sẽ kiểm tra không chỉ req.body mà còn tất cả các giá trị req.cookies, req.headers, req.params hay req.query.
Ngoài các hàm có sẵn, express-validator còn cho phép chúng ta có thể custom middleware để lọc dữ liệu.
|
Ví dụ như Sequelize, Knex, mongoose, … Tuyệt đối đừng dùng kiểu câu truy vấn bằng bằng chuỗi Javascript kiểu như, rất tù vì phải nối chuỗi JS mà lại không đảm bảo. Các thư viện họ có hàm gọi rất tiện lợi mà lại đảm bảo an toàn hơn.
|
Với http, dữ liệu từ các client gửi lên server hoàn toàn ‘trong sáng’ và có thể bị hacker bắt và đọc được toàn bộ. Các trình duyệt như Chrome, Firefox, … cũng sẽ hiển cảnh báo khi truy cập vào các website sử dụng http. Với Https, dữ liệu truyền lên server sẽ được mã hóa và tránh khỏi sự dòm ngó từ kẻ xấu.
Để sử dụng https cho website một cách đơn giản, nhanh chóng. Chúng ta có thể sử dụng 2 dịch vụ rất phổ biến sau đây.
Tuyệt đối không đưa những biến quan trọng, bí mật như secret key, mật khẩu database, … hiển thị ở trong mã nguồn. Hãy đưa các biến đó vào trong file .env (đưa file .env vào .gitignore). Sau đó lấy biến ra bằng lệnh process.env.[tên_biến]
|
Không nên sử dụng các hàm băm đã lỗi thời như SHA1, MD5, thư viên Crypto mặc định của Node.JS hay cả những hàm băm khá ‘hiện đại’ như SHA-256 để băm mật khẩu. Vì các hàm băm nêu trên một là rất yếu, 2 là không phù hợp để dùng cho việc băm mật khẩu (Số Hash/giây cao). Brcrypt và Pbkdf2 có chỉ số Hash/giây cao hơn đồng nghĩa với việc hacker muốn tấn công bằng phương pháp từ điển cầu vồng thì mất nhiều công sức, thời gian hơn so với việc sử dụng các hàm băm khác.
Giới hạn kích thích payload từ phía client gửi lên server cũng là một cách nhằm ngăn chặn các cuộc tấn công DOS/DDOS (bắt server sử lý 1 lượng dữ liệu lớn thay vì gửi thật nhiều request).
|
Nguồn: hybrid-technologies