Cookie “đã ký” trong connect / expressjs là gì?


114

Tôi đang cố gắng tìm ra "cookie đã ký" thực sự là gì. Không có nhiều thứ trên mạng và nếu tôi thử điều này:

app.use(express.cookieParser('A secret'));

Nhưng vẫn ... Cookie vẫn bình thường 100% trên trình duyệt và tôi thực sự không biết "đã ký" ở đây là gì (tôi đã hy vọng "thấy" một số điều kỳ lạ trên ứng dụng khách, giống như dữ liệu được mã hóa bằng cách sử dụng "Một bí mật" như muối?)

Tài liệu cho biết ( https://github.com/expressjs/cookie-parser ):

Phân tích cú pháp tiêu đề Cookie và điền req.cookies vào một đối tượng được khóa bằng tên cookie. Theo tùy chọn, bạn có thể bật hỗ trợ cookie đã ký bằng cách chuyển một secretchuỗi, chuỗi này sẽ gán req.secretđể nó có thể được phần mềm trung gian khác sử dụng.

Có ai biết không?

Merc.

Câu trả lời:


135

Cookie sẽ vẫn hiển thị, nhưng nó có chữ ký, vì vậy nó có thể phát hiện xem khách hàng có sửa đổi cookie hay không.

Nó hoạt động bằng cách tạo HMAC của giá trị (cookie hiện tại) và base64 đã mã hóa nó. Khi cookie được đọc, nó sẽ tính toán lại chữ ký và đảm bảo rằng nó khớp với chữ ký được đính kèm với nó.

Nếu không khớp thì sẽ báo lỗi.

Nếu bạn muốn ẩn nội dung của cookie, thay vào đó bạn nên mã hóa nó (hoặc chỉ lưu trữ nó trong phiên phía máy chủ). Tôi không chắc liệu có phần mềm trung gian cho điều đó đã xuất hiện hay không.

Biên tập

Và để tạo một cookie đã ký, bạn sẽ sử dụng

res.cookie('name', 'value', {signed: true})

Và để truy cập một cookie đã ký, hãy sử dụng signedCookiesđối tượng của req:

req.signedCookies['name']

Cảm ơn! Nhưng ... tôi không thấy chữ ký được thêm vào cookie vào lúc này. Có nghĩa là, trong ứng dụng khách, cookie ở đó mà không có chữ ký. Có điều gì tôi cần làm để kích hoạt tính năng ký cookie, ngoài việc đưa thông điệp bí mật vào express.cookieParser()không?
Merc

Chờ đã ... Tôi đang cài đặt cookie res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );nhưng ... Tôi nghi ngờ đó là ký tên! Phần mềm trung gian cookieParser () đã sẵn sàng để phân tích cú pháp các cookie đã ký, nhưng tôi chắc chắn không thực hiện đúng cài đặt ... tôi có phải ký chúng theo cách thủ công không ...?
Merc

6
Đó là: (res.cookie(name, value, { signed: true })). Báo cáo "chi tiết" bị thiếu từ tài liệu ...
Merc

6
Đánh cắp một phiên là một cái gì đó khác biệt ... đó là người dùng B lấy danh tính của người dùng A. Cookie đã ký chỉ là một cách để xác minh rằng nội dung của cookie không bị thay đổi bởi người dùng, vì vậy nội dung có thể được tin cậy.
staackuser 2

9
Đáng nói If it does not match, then it will give an error.Không phải là một lỗi . Chỉ cần request.signedCookie cho khóa đó chưa được đặt . Vì vậy, giống như bị bỏ qua
basarat

25

Đúng như biểu tượng cảm xúc đề cập nó chỉ đơn giản là để đảm bảo rằng một giá trị không bị giả mạo. Nó được đặt trong một đối tượng khác (req.signedCookies) để phân biệt giữa hai đối tượng, cho phép nhà phát triển thể hiện ý định. Nếu chúng được lưu trữ trong req.cookies cùng với những người khác, ai đó có thể chỉ cần tạo ra một cookie không dấu cùng tên, đánh bại toàn bộ mục đích của chúng.


11

Tôi đã tìm kiếm khá nhiều để có câu trả lời hay cho điều này ... Và việc nhìn vào mã nguồn của cookie-signature, được sử dụng cookie-parserđể ký các cookie đã ký đã cho tôi hiểu rõ hơn về cookie đã ký là gì.

valtất nhiên là giá trị của cookie và secretlà chuỗi bạn thêm làm tùy chọn cookie-parser

https://github.com/visionmedia/node-cookie-signature/blob/master/index.js#L16


3
Đây là một liên kết chuẩn được lưu giữ: github.com/tj/node-cookie-signature/blob/…

Đọc mã thực sự là một lời giải thích tốt hơn nhiều. Cảm ơn!

0

Tôi đã sử dụng cookie-parser phiên bản 1.4.4.

Tôi có thể thêm cookie đã ký và cookie đã ký được mã hóa trong trình duyệt, Nếu tôi cố gắng chỉnh sửa cookie đã ký bằng editThisCookie (plugin chrome) thì cookie-parser sẽ phát hiện thay đổi bên ngoài và sau đó đặt false làm giá trị.

response.cookie('userId',401,{signed: true})

Tiêu đề phản hồi trong trình duyệt, xuất hiện dưới dạng

Set-Cookie: empId=s%3A101.US2oSV4TSvfkvvEQ5fj1sXsjj8rNxx2ph4VdHNTuKX8; Path=/

Nhận cookie đã ký

request.signedCookies

https://gist.github.com/dineshbalaji/607d166f0240f932a5cb02099b0ece4c

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.