Autentizační token jako součást URL
Docela složitě jsem vybíral název pro tenhle post a tak bude lepší, když přejdu přímo k problému, který si osvětlíme na příkladu. Dejme tomu, že máme komentářový systém a chceme, aby měl každý pisatel možnost svůj komentář zpětně změnit. Protože nechceme, aby si pisatel musel přihlašovat resp. někde registrovat, jsme postaveni před problém jak uživatele autentifikovat.
Možné scénáře
Heslo ke každému komentáři
- Pisatel vytvoří komentář a zadá k němu heslo (případně se mu vygeneruje)
- Při pokusu o editaci je uživatel nucen zadat heslo
Nevýhoda tohoto řešení je zřejmá, pisatel si musí pamatovat
heslo ke každému komentáři, samozřejmě pokud si nebude všude volit stejné heslo. Tenhle systém by šlo modifikovat následujícím způsobem.
- Pisatel vytvoří komentář
- Pisatel obdrží URL pro editaci komentáře a to včetně hesla
- Při pokusu o editaci použije tuto URL
URL resp. GET požadavek by byl samozřejmě přes HTTPS např.
https://server/editComment.foo?commentId=1&pass=bflmpsvz. Bezpečnost přenosu
zaručena pomocí HTTPS, ale stejně je heslo volně viditelné v adresním řádku
prohlížeče. Chtělo by se to zbavit hesla v URL.
Část URL jako autentizační token
- Pisatel vytvoří komentář
- Pisatel obdrží URL s autentizačním tokenem pro editaci
- Při pokusu o editaci uživatel použije tuto URL
Opět vycházíme z toho, že vlastní GET požadavek by šel bezpečnou cestou. Fígl řešení
spočívá v unikátnosti dané URL a v časové náročnosti pro její hacknutí. Unikátnost vygenerované URL je zaručena serverem, který může postupovat například takto.
- Server vezme identifikátor daného komentáře
- Identifikátor komentáře je upraven pomocí konstanty (např. prohození prvního znaku s posledním)
- Upravený identifikátor se prožene přes symetrickou šifru
- Zašifrovaný identifikátor je pomocí BASE64 vložen do URL
Výsledná URL pak vypadá např. takhle https://server/editComment.foo?hoo=U9j5SVoEynNKsj4f1XQLVQ. Při požadavku na editaci komentáře je postup opačný. Výhoda spočívá v tom, že hloupoučkou změnou URL se ničeho nedosáhne a pro případné prolomení bude muset použít brute force. Nevýhoda je ta, že pisatel si takto vytvořenou URL nezapamatuje, stejně jako si jí ovšem nezapamatuje např. kolemjdoucí v internetové kavárně.
Související články
Související epizody CZ Podcastu
- #217 · Ivo Lukačovič
O Windy, JavaScriptu a budování firem.
- #3 · Java 6 SE, Vývoj webových aplikací
Dagi a Filemon o novinkách v Javě 6 a webových frameworcích.