Що таке "підписані" файли cookie у connect / expressjs?


114

Я намагаюся розібратися, що насправді "підписані файли cookie". У мережі не так багато, і якщо я спробую це:

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

Але все-таки ... Файли cookie все ще на 100% є нормальними для браузера, і я не знаю, що тут "підписано" (я начебто сподівався "побачити" якусь дивність на клієнті, щось на зразок даних, зашифрованих за допомогою "Секрет", як сіль?)

Документація говорить ( https://github.com/expressjs/cookie-parser ):

Проаналізуйте заголовок cookie та заповніть req.cookies об’єкт, введений іменами файлів cookie. За бажанням ви можете увімкнути підтримку підписаних файлів cookie, передавши secretрядок, яка призначає req.secretтак, щоб вона могла використовуватись іншими програмними засобами.

Хтось знає?

Merc.

Відповіді:


135

Файл cookie все ще буде видно, але він має підпис, тому він може виявити, чи змінив клієнт файл cookie.

Він працює, створюючи HMAC значення (поточне cookie), а base64 закодував його. Коли файл cookie читається, він перераховує підпис і переконується, що він відповідає підписаному до нього підпису.

Якщо воно не збігається, то воно дасть помилку.

Якщо ви хочете також приховати вміст файлу cookie, слід замість цього зашифрувати його (або просто зберегти його на сеансі на сервері). Я не впевнений, чи є середнє програмне забезпечення для цього вже чи ні.

Редагувати

І для створення підписаного файлу cookie ви б використовували

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

А для доступу до підписаного файлу cookie використовуйте signedCookiesоб’єкт req:

req.signedCookies['name']

Дякую! Але ... наразі я не бачу підпису, доданого до файлу cookie. Тобто у клієнта печиво є без підпису. Чи потрібно щось зробити, щоб увімкнути підпис файлу cookie, окрім включення секретного повідомлення express.cookieParser()?
Merc

Почекай ... Я встановлюю файли cookie, res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );але ... я сумніваюся, що це підписує! Програмне забезпечення cookieParser () готове до розбору підписаних файлів cookie, але я, безумовно, не роблю налаштування правильно ... чи потрібно їх підписувати вручну ...?
Merc

6
Це було: (res.cookie(name, value, { signed: true })). Повідомлення про відсутніх "деталях" з документації ...
Merc

6
Викрадення сеансу - це щось інше ... тобто користувач B приймає особу користувача А. Підписані файли cookie - це лише спосіб перевірити, чи вміст файлу cookie не змінено користувачем, тому вмісту можна довіряти.
staackuser2

9
Варто згадати If it does not match, then it will give an error.Не помилка . Просто request.signedCookie для цього ключа не встановлено . Тож більше, як ігнорувати
базарат

25

Так, як згадує емостар, просто переконатися, що значення не було підроблене. Він розміщується в іншому об'єкті (req.signedCookies) для розмежування двох, що дозволяє розробнику проявляти наміри. Якби вони зберігалися в req.cookies разом з іншими, хтось міг би просто створити непідписане печиво з такою ж назвою, перемігши загальну мету.


11

Я шукав досить розгорнуту відповідь на це… І дивлячись на вихідний код cookie-signature, який використовується cookie-parserдля підписання файлів cookie, дав мені краще розуміння того, що таке підписане cookie.

valЗвичайно, це значення файлу cookie, і secretце рядок, який ви додаєте в якості опції cookie-parser

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


3
Ось збережене канонічне посилання: github.com/tj/node-cookie-signature/blob/…

Читання коду було справді набагато кращим поясненням. Дякую!

0

Я використовував cookie-parser 1.4.4 версії.

Я можу додати підписані файли cookie та підписані файли cookie, зашифровані у веб-переглядачі. Якщо я спробую редагувати підписаний файл cookie за допомогою editThisCookie (хромований плагін), тоді аналізатор cookie виявить зовнішні зміни, а потім встановить значення false як значення.

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

Заголовок відповіді у веб-переглядачі відображається як

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

Отримайте підписане печиво

request.signedCookies

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.