คุกกี้ "เซ็นชื่อ" ในการเชื่อมต่อ / expressjs คืออะไร


115

ฉันกำลังพยายามหาคำตอบว่าแท้จริงแล้ว "คุกกี้ที่ลงชื่อ" คืออะไร บนเน็ตมีไม่มากและถ้าฉันลองสิ่งนี้:

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

แต่ถึงกระนั้น ... คุกกี้ยังคงเป็นปกติ 100% บนเบราว์เซอร์และฉันไม่รู้จริงๆว่า "เซ็นชื่อ" อยู่ที่นี่ (ฉันหวังว่าจะ "เห็น" ความแปลกประหลาดบางอย่างในไคลเอนต์เช่นข้อมูลที่เข้ารหัสโดยใช้ "ความลับ" เท่าเกลือ?)

เอกสารระบุว่า ( https://github.com/expressjs/cookie-parser ):

แยกส่วนหัวคุกกี้และเติมข้อมูลreq.cookies ด้วยออบเจ็กต์ที่คีย์ด้วยชื่อคุกกี้ คุณสามารถเลือกที่จะเปิดใช้งานการรองรับคุกกี้ที่มีลายเซ็นได้โดยการส่งsecretสตริงซึ่งกำหนดreq.secretให้มิดเดิลแวร์อื่นอาจใช้

มีใครรู้บ้างไหม?

Merc.

คำตอบ:


136

คุกกี้จะยังคงมองเห็นได้ แต่มีลายเซ็นดังนั้นจึงสามารถตรวจจับได้ว่าลูกค้าแก้ไขคุกกี้หรือไม่

ทำงานโดยการสร้าง HMAC ของค่า (คุกกี้ปัจจุบัน) และ base64 เข้ารหัส เมื่อคุกกี้ได้รับการอ่านคุกกี้จะคำนวณลายเซ็นใหม่และตรวจสอบให้แน่ใจว่าตรงกับลายเซ็นที่แนบมา

หากไม่ตรงกันก็จะให้ข้อผิดพลาด

หากคุณต้องการซ่อนเนื้อหาของคุกกี้ด้วยคุณควรเข้ารหัสแทน (หรือเก็บไว้ในเซสชันฝั่งเซิร์ฟเวอร์) ฉันไม่แน่ใจว่ามีมิดเดิลแวร์สำหรับสิ่งนั้นอยู่แล้วหรือไม่

แก้ไข

และเพื่อสร้างคุกกี้ที่มีลายเซ็นคุณจะใช้

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

และในการเข้าถึงคุกกี้ที่ลงนามให้ใช้signedCookiesวัตถุreq:

req.signedCookies['name']

ขอบคุณ! แต่ ... ฉันไม่เห็นลายเซ็นที่ต่อท้ายคุกกี้ในขณะนี้ นั่นคือในไคลเอนต์คุกกี้จะอยู่ที่นั่นโดยไม่มีลายเซ็น ฉันต้องทำอะไรบ้างเพื่อเปิดใช้งานการลงนามคุกกี้นอกเหนือจากการรวมข้อความลับในexpress.cookieParser()?
Merc

เดี๋ยวก่อน ... ฉันกำลังตั้งค่าคุกกี้ด้วยres.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );แต่ ... ฉันสงสัยว่านั่นคือการเซ็นชื่อมัน! มิดเดิลแวร์ CookieParser () พร้อมที่จะแยกวิเคราะห์คุกกี้ที่ลงนามแล้ว แต่ฉันตั้งค่าไม่ถูกต้อง ... ฉันต้องเซ็นชื่อด้วยตนเอง ... ?
Merc

6
มันคือ: (res.cookie(name, value, { signed: true })). รายงานที่ขาดหายไป "รายละเอียด" จากเอกสาร ...
Merc

6
การแย่งชิงเซสชันเป็นสิ่งที่แตกต่างออกไป ... นั่นคือผู้ใช้ B รับข้อมูลประจำตัวของผู้ใช้ A. คุกกี้ที่ลงชื่อเป็นเพียงวิธีการตรวจสอบว่าผู้ใช้ไม่ได้เปลี่ยนแปลงเนื้อหาของคุกกี้ดังนั้นเนื้อหาจึงสามารถเชื่อถือได้
staackuser2

9
มูลค่าการกล่าวขวัญIf it does not match, then it will give an error.ไม่ใช่ข้อผิดพลาด เพียงแค่ request.signedCookie สำหรับคีย์ที่ไม่ได้ตั้งค่า เหมือนเพิกเฉย
basarat

25

ใช่เช่นเดียวกับที่ emostar กล่าวถึงมันเป็นเพียงเพื่อให้แน่ใจว่าค่าไม่ได้ถูกดัดแปลง วางไว้ในออบเจ็กต์อื่น (req.signedCookies) เพื่อแยกความแตกต่างระหว่างทั้งสองทำให้นักพัฒนาสามารถแสดงเจตนาได้ หากพวกเขาถูกเก็บไว้ใน req.cookies พร้อมกับคนอื่น ๆ ใครบางคนก็สามารถสร้างคุกกี้ที่ไม่ได้ลงชื่อที่มีชื่อเดียวกันซึ่งจะเอาชนะจุดประสงค์ทั้งหมดของพวกเขา


11

ฉันค้นหาคำตอบที่ดีเกี่ยวกับเรื่องนี้มาพอสมควร ... และเมื่อดูที่ซอร์สโค้ดของcookie-signatureที่ใช้cookie-parserในการลงนามในคุกกี้ที่ลงนามทำให้ฉันเข้าใจได้ดีขึ้นว่าคุกกี้ที่ลงนามคืออะไร

valแน่นอนว่าเป็นมูลค่าของคุกกี้และsecretเป็นสตริงที่คุณเพิ่มเป็นตัวเลือก cookie-parser

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


3
นี่คือลิงค์ Canonical ที่เก็บรักษาไว้: github.com/tj/node-cookie-signature/blob/…

การอ่านโค้ดเป็นคำอธิบายที่ดีกว่ามาก ขอบคุณ!

0

ฉันใช้คุกกี้พาร์เซอร์เวอร์ชัน 1.4.4

ฉันสามารถเพิ่มคุกกี้ที่ลงชื่อและคุกกี้ที่เข้ารหัสในเบราว์เซอร์ได้หากฉันพยายามแก้ไขคุกกี้ที่ลงชื่อโดยใช้ editThisCookie (ปลั๊กอิน chrome) ตัวแยกวิเคราะห์คุกกี้จะตรวจพบการเปลี่ยนแปลงภายนอกจากนั้นตั้งค่าเท็จเป็นค่า

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

ส่วนหัวการตอบกลับในเบราว์เซอร์ปรากฏเป็น

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

รับคุกกี้ที่ลงนาม

request.signedCookies

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.