Что такое «подписанные» файлы 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.

Merc
источник

Ответы:

135

Файл cookie по-прежнему будет виден, но у него есть подпись, поэтому он может определить, изменил ли клиент файл cookie.

Он работает, создавая HMAC значения (текущего файла cookie) и закодированного в base64. Когда файл cookie считывается, он пересчитывает подпись и проверяет, соответствует ли она прикрепленной к нему подписи.

Если он не совпадает, то выдаст ошибку.

Если вы хотите также скрыть содержимое файла cookie, вам следует вместо этого зашифровать его (или просто сохранить в сеансе на стороне сервера). Я не уверен, есть ли уже промежуточное ПО для этого или нет.

редактировать

А для создания подписанного файла cookie вы должны использовать

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

А для доступа к подписанному cookie используйте signedCookiesобъект req:

req.signedCookies['name']
staackuser2
источник
Спасибо! Но ... Я не вижу подписи, прикрепленной к файлу cookie. То есть в клиенте cookie есть без подписи. Есть ли что-то, что мне нужно сделать, чтобы включить подпись файлов cookie, кроме включения секретного сообщения express.cookieParser()?
Merc
Погодите ... Я устанавливаю куки, res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );но ... Сомневаюсь, что подписываю это! Промежуточное ПО cookieParser () готово к синтаксическому анализу подписанных файлов cookie, но я определенно не правильно выполняю настройку ... нужно ли мне подписывать их вручную ...?
Merc
6
Это было: (res.cookie(name, value, { signed: true })). Сообщение об отсутствующей "детали" из документации ...
Merc,
6
Взлом сеанса - это нечто иное ... то есть пользователь B принимает личность пользователя A. Подписанные файлы cookie - это всего лишь способ проверить, что содержимое файла cookie не было изменено пользователем, поэтому его содержимому можно доверять.
staackuser2 06
9
Стоит упомянуть If it does not match, then it will give an error.Не ошибка . Просто request.signedCookie для этого ключа не установлен . Так что больше похоже на игнорирование
basarat 08
25

Ага, как и упоминает emostar, это просто для того, чтобы гарантировать, что значение не было изменено. Он помещается в другой объект (req.signedCookies), чтобы различать их, позволяя разработчику продемонстрировать намерение. Если бы они были сохранены в req.cookies вместе с другими, кто-то мог бы просто создать неподписанный файл cookie с тем же именем, уничтожив всю их цель.

Т. Дж. Головайчук
источник
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-парсер версии 1.4.4.

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

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

Заголовок ответа в браузере отображается как

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

Получить подписанный файл cookie

request.signedCookies

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

Динеш
источник