Trong bài viết này tôi sẽ hướng dẫn cách sử dụng CSRF để chống lại kiểu tấn công “Mượn gió bẻ măng” cho các ứng dụng viết bằng Express 4 và AngularJS. Cả hai frameworks đều đã có sẵn mã bảo vệ CSRF song chúng chưa hiểu nhau và cần 1 vài điều chỉnh au-tô-mát-tay.

Express đã tách middleware csrf ra khỏi phiên bản 4. Do vậy ta cần phải cắm 1 middleware ngoài csurf trên npm repository. Cũng giống với phiên bản built-in thì csurf sinh ra 1 chuỗi token ngẫu nhiên duy nhất cho mỗi user. Token này được lưu trong session của user trên Server. Tất cả các request gửi đến thường là PUT, POST, DELETE sẽ được validate mã CSRF token gửi từ client với token được lưu trên server. Nếu không hợp lệ thì request sẽ bị từ chối và client sẽ nhận được mã lỗi  403 Forbidden .

Middleware  csurf  sẽ tìm kiếm token trong các request đến trong req.body, req.query hoặc header files: x-csrf-token/x-xsrf-token. Mặc định thì middle này sẽ bỏ qua và không kiểm tra các METHOD là: [‘GET’, ‘HEAD’, ‘OPTIONS’]

Bảo mật CSRF trong AngularJS, theo tài liệu đặc tả thì trước khi tạo 1 request đến server nó sẽ đọc 1 giá trị cookie mặc định là XSRF-TOKEN và gán vào 1 giá trị HTTP header gửi đi (X-XSRF-TOKEN).

XSRF is a technique by which an unauthorized site can gain your user’s private data. Angular provides a mechanism to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie (by default, XSRF-TOKEN) and sets it as an HTTP header (X-XSRF-TOKEN). Since only JavaScript that runs on your domain could read the cookie, your server can be assured that the XHR came from JavaScript running on your domain. The header will not be set for cross-domain requests.

To take advantage of this, your server needs to set a token in a JavaScript readable session cookie called XSRF-TOKEN on the first HTTP GET request. On subsequent XHR requests the server can verify that the cookie matches X-XSRF-TOKEN HTTP header, and therefore be sure that only JavaScript running on your domain could have sent the request. The token must be unique for each user and must be verifiable by the server (to prevent the JavaScript from making up its own tokens). We recommend that the token is a digest of your site’s authentication cookie with a salt for added security.

Như vậy, bằng việc gán 1 giá trị cookie với tên XSRF-TOKEN, thì phía client (AngularJS) không cần phải thêm bất cứ thay đổi nào cả hay take-care quá nhiều.

Và sau đây là 2 bước sử dụng CSRF trong Express 4 với AngularJS.

1. Thêm mô-đun csurf vào package.json

"csurf": "~1.2.0"

Hoặc sử dụng command-line để thêm

npm install csurf --save

2. Cấu hình Express server

Khởi tạo csurf và thêm middleware để gán 1 giá trị cookie cho AngularJS.

var  csrf = require('csurf')
    , express = require('express')
    , session = require('express-session')
    ;

// Cookie 
// Session initialization etc
app.use(cookieParser());
app.use(session({secret: '1@vndm?how', saveUninitialized: true, resave: true}));

// Important : csrf should be added after cookie and session initialization.
// Otherwise you will get 'Error: misconfigured csrf'
app.use(csrf());
app.use(function(req, res, next) {
    res.cookie('XSRF-TOKEN', req.csrfToken());
    next();
});

Done! And break your leg.

About The Author

  • Khue Pham

    (y)