2013-04-04 23 views
17

Gần đây tôi đã tạm dừng thiết lập HTTPS trên máy chủ nút/tốc độ. Tôi đã quản lý thành công để chuyển hướng tất cả các tuyến đường sử dụng https bằng cách sử dụng mã bên dưới:Chuyển hướng HTTPS cho tất cả các tuyến đường node.js/express - Các mối quan ngại về bảo mật

// force https redirect 
var https_redirect = function(req, res, next) { 
    if (req.secure) { 
    if(env === 'development') { 
     return res.redirect('https://localhost:3000' + req.url); 
    } else { 
     return res.redirect('https://' + req.headers.host + req.url); 
    } 
    } else { 
    return next(); 
    } 
}; 

app.get('*', function(req, res, next) { 
    https_redirect(req, res, next); 
}); 

Điều này có vẻ hoạt động tốt. Tuy nhiên, vì tôi đã không tham gia vào điều này trước khi tôi có một số câu hỏi:

  1. Đây có phải là cách lý tưởng để chuyển hướng từ http đến https không?
  2. Nếu người dùng sử dụng tuyến đường http, trước khi chuyển hướng là có thể cho bất kỳ ai sử dụng một cái gì đó như sslstrip để tìm hiểu thông tin phiên.

nút: v0.8.2; bày tỏ: v3.05

Trả lời

42
function requireHTTPS(req, res, next) { 
    if (!req.secure) { 
     //FYI this should work for local development as well 
     return res.redirect('https://' + req.get('host') + req.url); 
    } 
    next(); 
} 

app.use(requireHTTPS); 
app.get('/', routeHandlerHome); 

Cách tiếp cận trung gian sẽ làm việc vì nhanh sẽ chạy phần mềm trung gian theo thứ tự được thêm vào, trước khi nó chạy bộ định tuyến và nói chung loại chính sách trên toàn trang web này sạch hơn như phần mềm trung gian so với một tuyến ký tự đại diện.

Về câu hỏi 2 về các cookie phiên đánh hơi, phải được giải quyết bằng cách đánh dấu cookie là secure khi bạn đặt chúng. Nếu chúng chưa được đánh dấu an toàn, trình duyệt cũng sẽ truyền chúng với các yêu cầu HTTP, do đó sẽ khiến chúng bị đánh hơi.

+0

Peter cảm ơn phản hồi. Điều này thực sự hữu ích. – los7world

+2

Điều này thật tuyệt, nhưng hơi khó để phát triển nếu bạn đang sử dụng không chuẩn (80 cho HTTP, 443 cho HTTPS), bởi vì nó cố gắng chuyển hướng đến địa chỉ 'https: // localhost: [PORT]'. Giải pháp thay thế là đặt một biến môi trường 'SSL_PORT' trong môi trường' development', và nếu nó được định nghĩa, hãy thay thế cổng. Xem [tại đây] (https://gist.github.com/gingi/47df42a45bb1653002ee#file-gistfile1-js-L5-L8) cho đoạn mã được sửa đổi. – Gingi

+0

hei, làm thế nào tôi có thể kết nối với một khách hàng front-end sau khi làm điều này? Cảm ơn ! – alexsc

1

Bạn chỉ có thể sử dụng chức năng https_redirect của bạn (mặc dù một chút sửa đổi) như là một để tự động chuyển hướng tất cả các yêu cầu an toàn của bạn:

// force https redirect 
var https_redirect = function() { 
    return function(req, res, next) { 
    if (req.secure) { 
     if(env === 'development') { 
     return res.redirect('https://localhost:3000' + req.url); 
     } else { 
     return res.redirect('https://' + req.headers.host + req.url); 
     } 
    } else { 
     return next(); 
    } 
    }; 
}; 
app.use(https_redirect()); 

app.get('/', routeHandlerHome); 
+0

Hey Josh. Cảm ơn vi đa trả lơi. Bạn có thể làm nổi bật cách tiếp cận của bạn cụ thể với ứng dụng. sử dụng sẽ hoạt động so với việc triển khai của tôi. – los7world

+0

@ los7world: Với app.use(), bạn đặc biệt thiết lập một phần mềm trung gian không khớp với tuyến đường, do đó tất cả các tuyến đường của bạn sẽ đi qua nó. – red

+0

Đã hiểu. Cảm ơn vì đầu vào của bạn. – los7world

0

Tôi sử dụng mã đơn giản này để chuyển hướng các yêu cầu tùy thuộc vào việc ứng dụng có đang phát triển hoặc sản xuất hay không.

// force https redirect 
var forceHTTPS = function() { 
    return function(req, res, next) { 
    if (!req.secure) { 
     if (app.get('env') === 'development') { 
     return res.redirect('https://localhost:3001' + req.url); 
     } else { 
     return res.redirect('https://' + req.headers.host + req.url); 
     } 
    } else { 
     return next(); 
    } 
    }; 
}; 
Các vấn đề liên quan