Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: hary 20. 01. 2021, 17:50:11

Název: Přihlašování pomocí URL
Přispěvatel: hary 20. 01. 2021, 17:50:11
Zdraví, hodlám se pustit do vývoje menší jednoúčelové webové aplikace a přemýšlím, že bych místo standardních uživatelských účtů udělal přihlašování pomocí tokenů v URL. Myšlenka je taková, že uživatel zadá mail a na ten mu přijde odkaz do jeho portfolia. Odkaz si pak uloží třeba do záložek...

Nenapadají vás nějaké nevýhody, které by tento přístup mohl mít?

Očividně to není úplně obvyklé řešení, všude otravují s účty a hesly... Předpokládám že tam nebudou citlivá nebo zneužitelná data. Napadá mě ještě zakázat vyhledávačům indexování.
Název: Re:Přihlašování pomocí URL
Přispěvatel: PanVP 20. 01. 2021, 18:52:00
Podle tvých otázek o tom nic nevíš, ale to nevadí, pusť se do toho a držím palce.

Zatím je zbytečné ti vysvětlovat pojmy jako robots.txt
Nevýhoda tvého řešení je v tom, že si uživatel musí vždy najít ten tvůj ověřovací e-mail s linkem.
Další nevýhoda je v tom, že při použití krátkého tokenu (například uzivatel=a123), to někdo bruteforcne.
S pythonem, který se někam snaží připojit, dokážu za vteřinu ověřit asi 32 tisíc různých kombinací a to je jen "sranda skript". Takže držím palce ;-)
Název: Re:Přihlašování pomocí URL
Přispěvatel: Ondrej Nemecek 20. 01. 2021, 19:31:32
Používá se to celkem často, ale jen pro ověření v určitém časovém limitu (pak platnost tokenu vyprší). Třeba změna hesla, potvrzení akce apod.
Název: Re:Přihlašování pomocí URL
Přispěvatel: Filip Jirsák 20. 01. 2021, 19:50:21
Nevýhodu to má jednu dost podstatnou a docela zřejmou – URL není považováno za dlouhodobě tajný údaj, takže se nedá spoléhat na to, že někde neunikne. Zůstává v historii prohlížeče, v hlavičce Referer ji dostanou všechny objekty stahované ve stránce (externí obrázky, skripty apod.), všechny stránky, na které se uživatel z vaší stránky proklikne. Proto mívají takováhle autentizační URL omezenou časovou platnost.

Pokud opravdu chcete jít touhle cestou, doporučil bych alespoň ten přihlašovací token nedávat do serverové části URL, ale do fragmentu (za hash). Ten neopustí prohlížeč, není v Referer hlavičkách. Samozřejmě ho pak budete muset JavaScriptem přečíst a přidat do autentizační hlavičky, aby měl server podle čeho uživatele autentizovat.

Také určitě budete potřebovat možnost ten token zneplatnit v případě, kdy uživateli unikne.

Nicméně osobně bych ulehčení přihlášení řešil spíš tak, že uživatelům povolíte i autentizaci pomocí Facebooku, Google, Twiteru, MojeID, případně služeb, které jsou v daném oboru obvyklé. Váš způsob, že si uživatelé budou muset uložit adresu do oblíbených nebo jít pokaždé přes e-mail – vy tak možná web používáte, ale většina uživatelů asi ne.
Název: Re:Přihlašování pomocí URL
Přispěvatel: Kit 20. 01. 2021, 20:50:59
Na to by se mohla hodit HTTP autentizace. Stačí, když se uživatel jednou přihlásí.
Název: Re:Přihlašování pomocí URL
Přispěvatel: Filip Jirsák 20. 01. 2021, 21:18:42
Na to by se mohla hodit HTTP autentizace. Stačí, když se uživatel jednou přihlásí.
To záleží na tom, zda a jak si prohlížeč zapamatovává hesla. A v jiném prohlížeči (na jiném počítači) se bude muset přihlašovat znovu. To už může použít nejpoužívanější autentizaci přes formulář, kde budou aspoň fungovat i správci hesel implementovaní jako rozšíření prohlížeče (ti na dialog HTTP autentizace nedosáhnou).
Název: Re:Přihlašování pomocí URL
Přispěvatel: hary 21. 01. 2021, 00:19:51
Podle tvých otázek o tom nic nevíš, ale to nevadí, pusť se do toho a držím palce.

Zatím je zbytečné ti vysvětlovat pojmy jako robots.txt
Nevýhoda tvého řešení je v tom, že si uživatel musí vždy najít ten tvůj ověřovací e-mail s linkem.
Další nevýhoda je v tom, že při použití krátkého tokenu (například uzivatel=a123), to někdo bruteforcne.
S pythonem, který se někam snaží připojit, dokážu za vteřinu ověřit asi 32 tisíc různých kombinací a to je jen "sranda skript". Takže držím palce ;-)

Haha. Ale jako jo, profesně weby nedělám a tímhle si snažím rozšířit obzory, abych byl i jako full-stack lopata.

Pak to můžeš zkusit.
Název: Re:Přihlašování pomocí URL
Přispěvatel: hary 21. 01. 2021, 00:24:16
Nevýhodu to má jednu dost podstatnou a docela zřejmou – URL není považováno za dlouhodobě tajný údaj, takže se nedá spoléhat na to, že někde neunikne. Zůstává v historii prohlížeče, v hlavičce Referer ji dostanou všechny objekty stahované ve stránce (externí obrázky, skripty apod.), všechny stránky, na které se uživatel z vaší stránky proklikne. Proto mívají takováhle autentizační URL omezenou časovou platnost.

Pokud opravdu chcete jít touhle cestou, doporučil bych alespoň ten přihlašovací token nedávat do serverové části URL, ale do fragmentu (za hash). Ten neopustí prohlížeč, není v Referer hlavičkách. Samozřejmě ho pak budete muset JavaScriptem přečíst a přidat do autentizační hlavičky, aby měl server podle čeho uživatele autentizovat.

Také určitě budete potřebovat možnost ten token zneplatnit v případě, kdy uživateli unikne.

Nicméně osobně bych ulehčení přihlášení řešil spíš tak, že uživatelům povolíte i autentizaci pomocí Facebooku, Google, Twiteru, MojeID, případně služeb, které jsou v daném oboru obvyklé. Váš způsob, že si uživatelé budou muset uložit adresu do oblíbených nebo jít pokaždé přes e-mail – vy tak možná web používáte, ale většina uživatelů asi ne.

Děkuji, to jsou užitečné informace. Ještě to zvážím. Budu tam mít i klasickou autentizaci pro sebe jako admina, ale její zprovoznění pro všechny je spousta kódu navíc - zapomenutá hesla, požadavky na smazání účtu...
Název: Re:Přihlašování pomocí URL
Přispěvatel: L.. 21. 01. 2021, 08:21:35
A není řešení použít tam nějakého externího poskytovatele identity? MojeID / Google / Facebook / ...?

Já před lety řešil podobný problém. Psal jsem systém, kde si uživatel vybírá fotografie z focení k následné úpravě. A chtěl jsem obdobný scénář: Uživateli prostě jen pošlu odkaz, kde fotky vybírat, uživatelé si jej mohou přeposílat a přitom vím, kdo vybírá - jestli fotku hodnotil člověk, co na ní je, nebo někdo jiný ze skupiny. Na druhou stranu nechci, aby se bylo možné dostat se na jiné album (uhodnout jeho adresu).

Důležitým požadavkem byla minimální složitost, jak pro uživatele (nepotřebuje se registrovat), tak pro mne (žádné ruční přidělování práv, kdo může co vidět, prostě pošlu odkaz a je to).

Navrhl jsem to následovně:

- Album má jako identifikátor 32-znakový náhodný řetězec, který je v URL. Stejně tak fotky mají svoje náhodná id. Tedy dají se posílat odkazy na album, fotku, ale musím to id znát (dostat), není reálné ho uhodnout.

- Identifikace je pomocí identity z Facebooku. Poprvé musí uživatel potvrdit předání informací, při dalších návštěvách tam jde hned.

- Pro uživatele mám vytvořený lokálně záznam, kde jsou jeho data nacachována, abych mohl ukazovat ostatním uživatelům, kdo jak hodnotil.

- Mohu nastavit uživateli příznak, že může do administrace - tak z něho udělám administrátora (jsem zatím jediný, takže jsem to nastavoval prostě v SQL).

Za těch pár let s tím mám dobré zkušenosti. FB má skoro každý (jen v jednom případě dotyčný FB neměl) a když by to byl problém, mohl bych jednoduše přidat dalšího providera. Pro mě i pro uživatele je používání velmi jednoduché. Není to úplně super bezpečné, protože věřím externí autoritě, ale pro daný účel stačí.
Název: Re:Přihlašování pomocí URL
Přispěvatel: Filip Jirsák 21. 01. 2021, 09:04:29
Děkuji, to jsou užitečné informace. Ještě to zvážím. Budu tam mít i klasickou autentizaci pro sebe jako admina, ale její zprovoznění pro všechny je spousta kódu navíc - zapomenutá hesla, požadavky na smazání účtu...
Smazání účtu musíte řešit stejně. Místo zapomenutého hesla byste musel řešit zapomenuté URL. Musel byste řešit i změnu přihlašovacího URL, stejně jako změnu hesla. Myslím, že použití externího poskytovatele identity, bez možnosti vytvořit účet se jménem a heslem, je pořád menší zlo, než takhle nestandardní přihlašování. V MojeID si základní účet může vytvořit každý. Když použijete OpenID, tam si každý může provozovat vlastní server – kdyby měl někdo touhu opravdu nebýt závislý na žádném třetím poskytovateli.

Nebo použijte už hotové řešení, třeba Firebase Authentication (https://firebase.google.com/products/auth). Jsou v tom jména a hesla, přihlašování přes Google, Facebook, Twitter, Apple, Microsoft, GitHub… Pokud nebudete chtít ověření přes telefon, máte to zdarma. To mi pro vás připadá jako nejlepší řešení.
Název: Re:Přihlašování pomocí URL
Přispěvatel: neregistrovany 21. 01. 2021, 10:24:51
Na to by se mohla hodit HTTP autentizace. Stačí, když se uživatel jednou přihlásí.

Jenze uz se nikdy neodhlasi protoze HTTP BASE AUTH to neumi. Musete zavrit okno browseru (a spolehat ze nebezi na pozadi) nebo restartovat server. Sice jsem videl nejaky ochcavky ve forme zaslani neplatneho hesla misto odhlaseni (coz vygeneruje chybu a vyzaduje spravny login), ale neni to moc spolehlive.
Název: Re:Přihlašování pomocí URL
Přispěvatel: Hamparle 21. 01. 2021, 10:26:03
To co chce tazatel, je běžné a úspěsně se to používá. Je nutné myslet na bezpečné předání a uchování URL.
Samozřejmě to chce nějakou logiku kontroly přístupu, aby nebylo možné hádat 32000 přístupů za vteřinu.
Rozhodně nespoléhat na náhodný řetězec, minimálně by to chtělo zapojit J(son)W(eb)T(okens) a challenge-response (což na první pohled zní podivně, když je to jen přes URL, ale muselo by se to dělat právě na straně klienta, přes hash).

Taky záleží jestli to je pro nějaké domácí zápisky stavu špajzu pro úzký okruh nebo je to veřejná služba pro stovky miliony uživatelů.
Název: Re:Přihlašování pomocí URL
Přispěvatel: Filip Jirsák 21. 01. 2021, 11:12:37
Je nutné myslet na bezpečné předání a uchování URL.
Autor na to může myslet jak chce, ale ničemu to nepomůže – předávání ani uchování URL nemá pod kontrolou.

Samozřejmě to chce nějakou logiku kontroly přístupu, aby nebylo možné hádat 32000 přístupů za vteřinu.
Právě naopak, tady by byla výhoda, že klíč může být dostatečně dlouhý, nebo-li prostor pro hádání natolik řídký, že nikomu nepomůže, i kdyby uměl zkoušet miliardu klíčů za vteřinu.

Rozhodně nespoléhat na náhodný řetězec, minimálně by to chtělo zapojit J(son)W(eb)T(okens)
Mám náladu na komickou vložku. Takže se zeptám – proč?
Název: Re:Přihlašování pomocí URL
Přispěvatel: PanVP 21. 01. 2021, 12:42:13
Samozřejmě to chce nějakou logiku kontroly přístupu, aby nebylo možné hádat 32000 přístupů za vteřinu.
Právě naopak, tady by byla výhoda, že klíč může být dostatečně dlouhý, nebo-li prostor pro hádání natolik řídký, že nikomu nepomůže, i kdyby uměl zkoušet miliardu klíčů za vteřinu.

Kdo by to byl řekl, že s Jirsákem budu souhlasit :-D
Použití dlouhých klíčů skutečně dostatečně naředí celý prostor (což jsem i zmínil), navíc nám pomůže webserver, který není příliš rychlý a při nastavení vhodných pravidel proti útokům (DOS/DDOS) se to stane neefektivní.
Název: Re:Přihlašování pomocí URL
Přispěvatel: Filip Jirsák 21. 01. 2021, 12:59:20
Použití dlouhých klíčů skutečně dostatečně naředí celý prostor (což jsem i zmínil), navíc nám pomůže webserver, který není příliš rychlý a při nastavení vhodných pravidel proti útokům (DOS/DDOS) se to stane neefektivní.
Ten klíč musí být tak dlouhý, že to bude neefektivní i bez omezení proti DoS/DDoS útokům, i bez spoléhání na pomalost webserveru. Navrhněte to tak, aby to bylo neefektivní, i kdyby se útočník přímo na svém zařízení jedinou instrukcí procesoru dozvěděl, zda klíč existuje nebo neexistuje. A pak k tomu přidejte ještě několik řádů. Povolená délka URL je pro tohle opravdu dostatečná a přidat ke klíči pět deset bajtů navíc nikomu nic neudělá, ale vás to zbaví nutnosti nad tím přemýšlet.
Název: Re:Přihlašování pomocí URL
Přispěvatel: Hamparle 21. 01. 2021, 13:19:41
Rozhodně nespoléhat na náhodný řetězec, minimálně by to chtělo zapojit J(son)W(eb)T(okens)
Mám náladu na komickou vložku. Takže se zeptám – proč?
[/quote]
Bude z toho poznat, že jde o neoprávněný pokus, jestliže pujde o random string.
Název: Re:Přihlašování pomocí URL
Přispěvatel: Filip Jirsák 21. 01. 2021, 13:48:59
Citace
Rozhodně nespoléhat na náhodný řetězec, minimálně by to chtělo zapojit J(son)W(eb)T(okens)
Mám náladu na komickou vložku. Takže se zeptám – proč?
Bude z toho poznat, že jde o neoprávněný pokus, jestliže pujde o random string.
To máte pravdu, jenže je otázka, zda zrovna tohle by bylo úzké hradlo aplikace. Dávalo by to smysl u nějaké aplikace typu CDN, kde by hraniční servery rovnou dokázaly eliminovat zjevně neplatné pokusy a vůbec je nepouštět dál. U takovéhle aplikace, která poběží na jednom serveru a bude mít pár platných klíčů, se tím podle mne moc výkonu neušetří. Naopak to zavádí složitost do vývoje.
Název: Re:Přihlašování pomocí URL
Přispěvatel: PanVP 21. 01. 2021, 14:17:40

Nene, naštěstí jste se vrátil do zajetých kolejí a opět se pletete  ;D

Co takový index.php nebo router.php může dělat:
- routovat požadavek
- provádět include
- posílat dotaz do databáze, jestli daný klíč vůbec existuje
- logovat každou z jednotlivých položek

Pokud tam implementuji jednoduchou paritu (která nebude zjevná), mohu požadavek zahodit dřív, než se začnu připojovat do databáze a dělat ostatní kraviny.

Velmi chytré!
Název: Re:Přihlašování pomocí URL
Přispěvatel: hary 21. 01. 2021, 16:43:25
Pro vaše návrhy zvažuji ten FB. Je pravda, že by zjednodušilo spoustu věcí, nemusel bych standardně posílat žádné maily, nemusel bych řešit spamery a roboty... A přímý kontakt - mail, bych měl přes FB api získat taky. URL s tokenem bych mohl nechat třeba jen pro read-only přístup, pro ty co budou chtít
Název: Re:Přihlašování pomocí URL
Přispěvatel: Filip Jirsák 21. 01. 2021, 17:07:29

Nene, naštěstí jste se vrátil do zajetých kolejí a opět se pletete  ;D

Co takový index.php nebo router.php může dělat:
- routovat požadavek
- provádět include
- posílat dotaz do databáze, jestli daný klíč vůbec existuje
- logovat každou z jednotlivých položek

Pokud tam implementuji jednoduchou paritu (která nebude zjevná), mohu požadavek zahodit dřív, než se začnu připojovat do databáze a dělat ostatní kraviny.
Pro začátek vynecháme věci, které s ověřením klíče nijak nesouvisí. Takže pokud bude klíč náhodně generovaný řetězec, bude ověření klíče znamenat najít ho v seznamu vydaných klíčů. Vzhledem k tomu, že podle dotazu předpokládám tak desítky nebo stovky uživatelů, celá „databáze“ klíčů se vejde do paměti jako vyhledávací strom nebo hash tabulka.

Pokud by klíč bylo JWT, znamená to dekódovat reperezentaci klíče, ověřit podpis (předpokládejme rychlejší variantu s hashem). Pokud bude podpis platný, dekódujeme data z JWT, získáme identifikátor – a ten už můžeme hledat v databázi klíčů jako v předcházejícím případě. Pro oprávněného uživatele je to mnohem delší cesta, pro někoho, kdo jen zkouší náhodné klíče, to s tím dekódováním a hashováním nejspíš bude také delší, než jednoduché vyhledávání.

Pokud by tam nebylo JWT, ale „jednoduchá parita, která nebude zjevná“, je to učebnicový příklad security through obscurity.

Ale hlavně, pokud někdo na prostor klíčů třeba 2256 zkouší útočit hrubou silou, buď protože si neodhadl, jak velký ten prostor může být, nebo protože tomu nerozumí – pak je to nějaké tele, které bude možné jednoduše eliminovat blokací jedné IP adresy na firewallu.
Název: Re:Přihlašování pomocí URL
Přispěvatel: Ivan Brezina 21. 01. 2021, 17:42:13
Je mozny, ze vymyslis kolo. Zkus si neco precist o SAML, Federation Services, OpenID.

PS: jeste dost zalezi na tom jestli to pobezi na Internetu anebo na korporatnim intranetu.
Název: Re:Přihlašování pomocí URL
Přispěvatel: Filip Jirsák 21. 01. 2021, 17:56:09
Je mozny, ze vymyslis kolo. Zkus si neco precist o SAML, Federation Services, OpenID.
Pokud nechce řešit přihlašování heslem jako příliš složité, pochybuju, že chce řešit SAML nebo federation services.

PS: jeste dost zalezi na tom jestli to pobezi na Internetu anebo na korporatnim intranetu.
Poběží to na internetu, jak je zřejmé z dotazu.
Název: Re:Přihlašování pomocí URL
Přispěvatel: hary 21. 01. 2021, 23:44:58
Zkoušel jsem tu integraci s FB a musím říct že je to teda docela voser. Ze začátku nice, dají vám dají hezký kus javascriptu pro vložení do vaší stránky, ale už vám třeba pořádně neřeknou jak s tím správně pracovat na serverové straně. Lidi mají problémy s požadavkem na https při i při lokálním vývoji a já taky - to je pro mě dost komplikace (aplikace samotná https neumí a produkčně mám nginx s reverzní proxy).

...
Jak jsi řešil ty to HTTPS? Nebo to bylo předtím než to nakázali?
Název: Re:Přihlašování pomocí URL
Přispěvatel: hary 23. 01. 2021, 12:42:41
Nakonec jsem to vyřešil pomocí Spring Social, které používá OAuth a to mi projde. Takže jsem nemusel dělat psí kusy se svým vývojovým prostředím. Přihlašuje se pomocí přesměrování a výhoda je, že na frontendu nemusí být nic od FB - co by sledovalo uživatele. Pořád ale nejde z lokálu po přihlášení používat API FB a zažádat třeba o email, tak to mám při vývoji odifované. Integrace FB byla celkem frustrující, po změně strategie jsem zase samozřejmě bojoval o to víc se Spring Security. Celkově byla nutná spousta pokus omylů jako když člověk objevuje kolo, ale díky bohu za tu knihovnu. Stálo mě to přes 1 MD a ještě musím splnit nějaké policies a GDPR blbosti. Doufám že se neobjeví další problémy až to budu nasazovat naostro na svoji VPS. Možná vám potom hodím odkaz až to bude haha. A tokeny budou taky!