कनेक्ट / एक्सप्रेसजेज में "हस्ताक्षरित" कुकीज़ क्या हैं?


114

मैं यह पता लगाने की कोशिश कर रहा हूं कि वास्तव में "हस्ताक्षरित कुकीज़" क्या हैं। नेट पर बहुत कुछ नहीं है, और अगर मैं यह कोशिश करता हूं:

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

लेकिन फिर भी ... कुकीज़ अभी भी ब्राउज़र पर 100% सामान्य हैं, और मुझे वास्तव में पता नहीं है कि "हस्ताक्षरित" यहां क्या है (मैं क्लाइंट पर कुछ अजीबता को "देखने" की उम्मीद कर रहा था, कुछ ऐसा है जैसे डेटा का उपयोग करके एन्क्रिप्ट किया गया नमक के रूप में "एक गुप्त"?

दस्तावेज़ कहता है ( https://github.com/expressjs/cookie-parser ):

पार्स कुकी शीर्ष लेख और पॉप्युलेट req.cookies एक वस्तु कुकी नामों से keyed साथ। वैकल्पिक रूप से आप एक secretस्ट्रिंग पास करके हस्ताक्षरित कुकी समर्थन को सक्षम कर सकते हैं , जो असाइन करता है req.secretताकि इसका उपयोग अन्य मिडलवेयर द्वारा किया जा सके।

क्या कोई जानता है?

मर्क।

जवाबों:


135

कुकी अभी भी दिखाई देगी, लेकिन इसमें एक हस्ताक्षर है, इसलिए यह पता लगा सकता है कि ग्राहक ने कुकी को संशोधित किया है या नहीं।

यह मूल्य का एचएमएसी (वर्तमान कुकी) बनाकर काम करता है, और बेस 64 ने इसे एन्कोड किया। जब कुकी पढ़ी जाती है, तो यह हस्ताक्षर को पुन: प्रस्तुत करती है और यह सुनिश्चित करती है कि यह उससे जुड़े हस्ताक्षर से मेल खाती है।

यदि यह मेल नहीं खाता है, तो यह एक त्रुटि देगा।

यदि आप कुकी की सामग्री को छिपाना चाहते हैं, तो आपको इसके बजाय इसे एन्क्रिप्ट करना चाहिए (या सर्वर साइड सत्र में इसे संग्रहीत करता है)। मुझे यकीन नहीं है कि वहाँ पहले से ही वहाँ के लिए मिडलवेयर है या नहीं।

संपादित करें

और एक हस्ताक्षरित कुकी बनाने के लिए जिसका आप उपयोग करेंगे

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 उपयोगकर्ता की पहचान ले रहा है। हस्ताक्षरित कुकीज़ यह सत्यापित करने का एक तरीका है कि उपयोगकर्ता द्वारा कुकी की सामग्री को नहीं बदला गया है, इसलिए सामग्री पर भरोसा किया जा सकता है।
स्टैक्यूसर 2

9
If it does not match, then it will give an error.एक उल्लेख त्रुटि नहीं है । बस उस कुंजी के लिए request.signedCookie सेट नहीं है । तो अधिक की तरह नजरअंदाज कर दिया
basarat

25

युपस्टार जैसी भावना का उल्लेख है कि यह सुनिश्चित करना है कि मूल्य के साथ छेड़छाड़ नहीं की गई है। यह दोनों के बीच अंतर करने के लिए एक अलग ऑब्जेक्ट (req.signCookies) में रखा गया है, जिससे डेवलपर को इरादे दिखाए जा सकते हैं। यदि वे दूसरों के साथ req.cookies में संग्रहीत किए गए थे, तो कोई केवल उसी नाम के एक अहस्ताक्षरित कुकी को तैयार कर सकता है, उनमें से पूरे उद्देश्य को हरा सकता है।


11

मैं इस के लिए एक अच्छा जवाब के लिए बहुत व्यापक खोज रहा है ... और के स्रोत कोड को देखकर cookie-signature, कि cookie-parserहस्ताक्षरित कुकीज़ पर हस्ताक्षर करने के लिए उपयोग किया जाता है मुझे एक हस्ताक्षरित कुकी क्या है की बेहतर समझ दी है।

valनिश्चित रूप से कुकी का मूल्य है, और secretवह स्ट्रिंग है जिसे आप विकल्प के रूप में जोड़ते हैं cookie-parser

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


3
यहाँ एक संरक्षित विहित लिंक है: github.com/tj/node-cookie-signature/blob/…

कोड पढ़ना वास्तव में बहुत बेहतर स्पष्टीकरण था। धन्यवाद!

0

मैंने कुकी-पार्सर 1.4.4 संस्करण का उपयोग किया।

मैं ब्राउज़र में हस्ताक्षरित कुकी और हस्ताक्षरित कुकी जोड़ सकता हूं, अगर मैं editThisCookie (क्रोम प्लगइन) का उपयोग करके हस्ताक्षरित कुकी को संपादित करने का प्रयास करता हूं तो कुकी-पार्सर बाहरी परिवर्तन का पता लगाता है और फिर मूल्य के रूप में गलत सेट करता है।

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

ब्राउज़र में प्रतिक्रिया हेडर, के रूप में दिखाई देते हैं

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

हस्ताक्षरित कुकी प्राप्त करें

request.signedCookies

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.