2013-09-02 33 views
22

Tôi khá bối rối bởi tầm quan trọng của bí mật phiên . Tôi đang nhảy vào phát triển web với Express và Node, và tại thời điểm này, tôi đang cố gắng thực hiện một đăng nhập đơn giản. Mã dưới đây được lấy từ ví dụ về phiên trong Express.Tầm quan trọng của khoá bí mật phiên trong khung web Express

// Required by session() middleware 
// pass the secret for signed cookies 
// (required by session()) 
app.use(express.cookieParser('keyboard cat')); 

// Populates req.session 
app.use(express.session()); 

Sử dụng "mèo bàn phím" làm bí mật phiên. Nhiều thứ tôi đã xem xét về bí mật phiên làm tôi khuyên tôi nên thay đổi điều này thành một thứ gì đó tùy chỉnh. Bây giờ tôi có 3 câu hỏi cụ thể liên quan đến điều này.

  1. Tại sao tôi không thấy điều này trước khi tôi làm việc với PHP?
  2. Bí mật phiên được sử dụng chính xác là gì?
  3. Giả sử tôi thay đổi khóa phiên. Mã của tôi là mã nguồn mở. Sẽ không thay đổi điều này là một chút dư thừa trong trường hợp đó? Tôi không thấy yêu cầu người dùng sử dụng khóa tùy chỉnh làm tùy chọn.
  4. Tôi đã nghĩ đến việc tạo một UUID ngẫu nhiên để điền vào khóa. Có vấn đề với điều này? (về mặt an ninh)
+0

Tôi nghĩ rằng câu trả lời được đánh dấu là thiếu điểm, đó là liệu 'bí mật' có tạo phiên an toàn hơn không. Tôi khuyên bạn nên truy cập http://security.stackexchange.com/questions/92122/why-is-it-insecure-to-store-the-session-id-in-a-cookie-directly để thảo luận kỹ lưỡng hơn (không phải chỉ có câu trả lời bình chọn hàng đầu có liên quan). – argaz

+0

@argaz Tôi thấy rằng liên kết thực sự mang tính thông tin. Bạn có sẵn sàng để thêm bình luận của bạn như là một câu trả lời? – gluxon

Trả lời

6

Tôi nghĩ rằng điểm chính bị bỏ qua trong các câu trả lời khác, đó là liệu tham số secret có giúp quản lý phiên an toàn hơn hay không. nó được thảo luận độc đáo trong câu hỏi Security.StackExchange này: Why is it insecure to store the session ID in a cookie directly?

Tôi khuyên bạn nên đọc nó (không chỉ câu trả lời bình chọn hàng đầu có liên quan).

Đang cố gắng để tóm tắt: nó sẽ không làm giảm segnificantly cơ hội của một phiên được đoán và bắt cóc trong trường hợp đó phiên ID là những con số ngẫu nhiên lớn, nhưng nó rõ ràng sẽ giúp rất nhiều nếu session IDs có thể tùy chỉnh như ID gia tăng, có thể trong ExpressJS.

Người dùng có thể sử dụng ID phiên bất kỳ mà họ muốn. Có lẽ ai đó cảm thấy như họ nên sử dụng một số tăng tự động từ cơ sở dữ liệu SQL, nó không quan trọng, bởi vì chúng tôi bảo vệ quyết định không được cải thiện của họ bằng cách ký giá trị, kéo dài khóa.

35
  1. Vì PHP không phải là Nodej. Quản lý phiên trong PHP khác với quản lý phiên trong nút: nút không bao giờ chết, không giống như PHP, được gọi bằng daemon máy chủ của bạn (apache, IIS, bạn có), yêu cầu tạo một số nội dung, sau đó kết thúc quá trình của nó. Nút là tương đương với Apache cộng với PHP.
  2. Được sử dụng để mã hóa cookie phiên để bạn có thể hợp lý (nhưng không chắc chắn 100%) cookie không phải là giả mạo và kết nối sẽ được coi là một phần của phiên lớn hơn với Express.
  3. Đây là lý do tại sao bạn không đặt chuỗi trong mã nguồn của mình. Bạn biến nó thành biến môi trường và đọc nó như là process.env ("SESSION_SECRET") hoặc bạn sử dụng tệp .env với https://npmjs.org/package/habitat và đảm bảo những tệp đó không bao giờ chạm vào kho lưu trữ của bạn (loại trừ/loại trừ svn/git) để dữ liệu bí mật của bạn giữ bí mật.
  4. bí mật là không thay đổi trong khi ứng dụng nút của bạn chạy. Sẽ tốt hơn nếu bạn nghĩ ra câu dài, hài hước hơn một UUID, thường ngắn hơn nhiều so với "I didn't think I needed a secret, but the voices in my head told me Express needed one".

Làm thế nào tôi sử dụng phiên:

tập tin .env (luôn luôn trong tập tin .gitignore của tôi vì vậy nó không bao giờ chạm Repos công cộng của tôi):

SECRET="This is my funky secret oh my god it has ninja turtles" 

app.js:

var express = require('express'), 
    env = (function(){ 
     var Habitat = require("habitat"); 
     Habitat.load(); 
     return new Habitat(); 
    }()), 
    app = express(); 

app.use(express.compress()); // gzip all the things. If possible. 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.cookieSession({ 
    key: "mysite.sid", 
    // seeing this tells you nothing about the actual secret: 
    secret: env.get("SESSION_SECRET"), 
    cookie: { 
    maxAge: 2678400000 // 31 days 
    } 
})); 
app.use(express.csrf()); 

Bit CSRF đó đảm bảo rằng các yêu cầu trang đến từ trang web của riêng bạn, không phải yêu cầu cURL hoặc nhúng trong trang web của người khác. http://expressjs.com/api.html#csrf để biết thêm thông tin về điều đó.

+0

Tôi hiểu sự khác biệt giữa PHP và Node.js. Tôi chỉ không hiểu tại sao sự khác biệt đó sẽ dẫn đến việc quản lý phiên khác nhau. Tôi cảm thấy như PHP tạo ra một bí mật phiên ngẫu nhiên khi nó chạy, hoặc lấy một từ Apache. Như tôi đã nói, tôi sẽ không yêu cầu người dùng của tôi đặt bí mật phiên nếu có thể. – gluxon

+0

Ngoài ra, tại sao một chuỗi dài sẽ an toàn hơn một chuỗi uuid? Không thay đổi> độ dài? – gluxon

+2

@gluxon. Một uuid thường là một chuỗi ký tự hex, nếu bạn may mắn, hoặc một int dài, nếu bạn không. cụm từ dài đúng cách dài hơn, với tên miền biểu tượng lớn hơn. Nó dài hơn và đa dạng hơn. Đối với người dùng của bạn, hãy chọn bí mật phiên, họ sẽ không làm như vậy. Bạn là. Người dùng của bạn không bao giờ có thể nhìn thấy nó. –

3

Sự nhầm lẫn của tôi là giữa các phiên phía máy chủ và phiên phía máy khách. Trước ngày hôm nay, tôi đã không biết về phía khách hàng. Một giải thích rõ ràng về sự khác biệt được tìm thấy dưới đây.

Why CherryPy session does not require a secret key?

Tư duy của mô hình server-side, tôi đã rất bối rối nơi mã hóa sẽ được yêu cầu trong phiên.

Các vấn đề liên quan