Co to są „podpisane” pliki cookie w connect / expressjs?

114

Próbuję dowiedzieć się, czym właściwie są „podpisane pliki cookie”. W sieci nie ma zbyt wiele, a jeśli spróbuję:

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

Ale nadal ... Pliki cookie są nadal w 100% normalne w przeglądarce i nie bardzo wiem, co to jest „podpisane” (miałem nadzieję, że „zobaczę” jakieś dziwne strony na kliencie, coś w rodzaju danych zaszyfrowanych przy użyciu „Sekret” jak sól?)

Dokumentacja mówi ( https://github.com/expressjs/cookie-parser ):

Przeanalizuj nagłówek Cookie i wypełnij req.cookies obiektem z kluczem według nazw plików cookie. Opcjonalnie można włączyć obsługę podpisanych plików cookie, przekazując secretciąg, który przypisuje, req.secretaby mógł być używany przez inne oprogramowanie pośredniczące.

Czy ktoś wie?

Merc.

Merc
źródło

Odpowiedzi:

135

Plik cookie będzie nadal widoczny, ale ma podpis, dzięki czemu może wykryć, czy klient zmodyfikował plik cookie.

Działa poprzez utworzenie HMAC wartości (bieżący plik cookie) i zakodowanie go w standardzie base64. Gdy plik cookie zostanie odczytany, ponownie oblicza podpis i upewnia się, że jest zgodny z podpisem do niego dołączonym.

Jeśli nie pasuje, spowoduje błąd.

Jeśli chcesz ukryć również zawartość pliku cookie, powinieneś zamiast tego zaszyfrować go (lub po prostu zapisać w sesji po stronie serwera). Nie jestem pewien, czy istnieje już oprogramowanie pośredniczące do tego, czy nie.

Edytować

I stworzyć podpisany plik cookie, którego użyjesz

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

Aby uzyskać dostęp do podpisanego pliku cookie, użyj signedCookiesobiektu req:

req.signedCookies['name']
staackuser2
źródło
Dzięki! Ale ... W tej chwili nie widzę podpisu dołączonego do pliku cookie. Oznacza to, że w kliencie plik cookie znajduje się bez podpisu. Czy jest coś, co muszę zrobić, aby włączyć podpisywanie plików cookie, poza dołączeniem tajnej wiadomości express.cookieParser()?
Merc
Poczekaj ... Ustawiam ciasteczka, res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );ale ... Wątpię, żeby to podpisywał! Oprogramowanie pośredniczące cookieParser () jest gotowe do analizowania podpisanych plików cookie, ale zdecydowanie nie robię tego ustawienia prawidłowo ... czy muszę je podpisywać ręcznie ...?
Merc
6
Było: (res.cookie(name, value, { signed: true })). Zgłaszanie brakującego "szczegółu" z dokumentacji ...
Merc
6
Przejęcie sesji to coś innego ... to znaczy, że użytkownik B przyjmuje tożsamość użytkownika A. Podpisane pliki cookie to tylko sposób na sprawdzenie, czy zawartość pliku cookie nie została zmieniona przez użytkownika, dzięki czemu można zaufać zawartości.
staackuser2,
9
Warto wspomnieć If it does not match, then it will give an error.Nie jest to błąd . Tylko request.signedCookie dla tego klucza nie jest ustawiony . Więc bardziej jak ignorowany
basarat
25

Tak, jak wspomina emostar, ma to po prostu zapewnić, że wartość nie została zmieniona. Jest umieszczany w innym obiekcie (req.signedCookies) w celu rozróżnienia między nimi, umożliwiając deweloperowi wykazanie zamiaru. Gdyby były przechowywane w req.cookies wraz z innymi, ktoś mógłby po prostu stworzyć niepodpisany plik cookie o tej samej nazwie, zniweczając cały ich cel.

TJ Holowaychuk
źródło
11

Szukałem dość obszernie w celu znalezienia dobrej odpowiedzi na to pytanie ... A patrząc na kod źródłowy cookie-signature, który jest używany przez cookie-parserdo podpisywania podpisanych plików cookie, lepiej zrozumiałem, czym jest podpisany plik cookie.

valjest oczywiście wartością pliku cookie i secretjest ciągiem znaków, które dodajesz jako opcję cookie-parser

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

Anders Östman
źródło
3
Oto zachowany link kanoniczny: github.com/tj/node-cookie-signature/blob/ ...
Przeczytanie kodu było rzeczywiście znacznie lepszym wyjaśnieniem. Dzięki!
0

Użyłem cookie-parser w wersji 1.4.4.

Mogę dodać podpisane pliki cookie i podpisane pliki cookie zaszyfrowane w przeglądarce.Jeśli spróbuję edytować podpisany plik cookie za pomocą editThisCookie (wtyczka Chrome), to analizator plików cookie wykrywa zewnętrzną zmianę i ustawia wartość false jako wartość.

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

Nagłówek odpowiedzi w przeglądarce, wyświetlany jako

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

Uzyskaj podpisany plik cookie

request.signedCookies

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

Dinesh
źródło