Bezpečnosť
Každú vlastnosť nižšie pokrýva test v testoch balíka.
- Enumerácia — verejné endpointy odpovedajú pre známe, neznáme, deaktivované aj neoverené účty rovnako (status aj telo) — v bezpečných režimoch aj registrácia, s registration.uniform_response v každom režime overenia; e-maily idú len skutočným aktívnym účtom, a to po odpovedi. Kontrola hesla prebehne vždy, pri neznámych účtoch voči fiktívnemu hashu s rovnakou náročnosťou, a prihlásenie heslom do uzamknutého účtu odpovie ako nesprávne heslo (rovnaký status, telo, náročnosť hashu aj započítanie do limitu); správne heslo za akýmkoľvek jednotným invalid_credentials si pokus v limite ponechá a počítadla uzamknutia sa nedotkne, rovnako ako nesprávne. Zmena e-mailu na obsadenú adresu odpovie aj upozorní starú adresu presne tak ako zmena na voľnú. Zariadenie sa stane známym len po dokončenom prihlásení — nie po odkaze na obnovu či prihlásenie vyžiadanom zo zariadenia ani po opätovnom overení (možno ukradnutým) prístupovým tokenom.
- Izolácia guardov — token, odkaz, kód, pozvánka, výzva ani passkey jedného guardu nikdy nefungujú na inom.
- Jednorazovosť — každé uplatnenie je podmienený update; výzvy postupujú s optimistickou kontrolou verzie a uchovávajú snímku verzie tokenu účtu.
- Invalidácia — tv++ zneplatní všetky existujúce prístupové tokeny; rodiny relácií sa zrušia (rodina vydaná pod staršou hodnotou tv — prihlásenie v súbehu s invalidáciou — pri prvej obnove, takže žiadna relácia neprežije obnovu hesla, deaktiváciu ani odhlásenie všade) a obnova zneplatní predošlý prístupový token relácie, takže zrušenie relácie zneplatní všetky tokeny, ktoré vydala; nevyužité odkazy na prihlásenie, obnovu, opätovné overenie a zmenu e-mailu zaniknú s nimi; denylist jti je poistka navyše.
- Obmedzovanie pokusov — pokusy sa započítajú atomicky ešte pred overením hesla či kódu — limity prihlásenia, e-mailov a opätovného overenia, e-mailové kódy aj vlastné max_attempts každej výzvy — takže nával súbežných pokusov nemôže limit obísť. Limit výzvy platí pre jednu výzvu: pri vypnutom limite two-factor pre účet (two-factor.attempts = null) je jedinou hranicou a každé nové prihlásenie otvorí nový rozpočet pokusov, preto limit nechajte zapnutý alebo routy výziev obmedzte sami (authentication:check na to upozorní).
- Dodatočné overenie pri riziku — require_second_factor platí pre každý spôsob prihlásenia, aj pri after_email_login = false; účet bez faktora na dodatočné overenie sa zamietne. Prihlásenie passkey, ktoré sa počíta ako MFA (passkeys.satisfies_mfa), už dodatočným overením je.
- Opätovné overenie — účty s druhým faktorom sa musia overiť ním; dôkaz heslom či e-mailovým kódom ani prihlásenie, ktoré faktor preskočilo, im bránu nikdy nesplní — ani keď si faktor nastavili až po tomto dôkaze. reauthentication.methods sa overuje voči faktoru, ktorý sa skutočne zhodoval.
- Tajomstvá v úložisku — HMAC-SHA-256 s kľúčom odvodeným z APP_KEY (alebo hash_key); otvorená podoba existuje len v odpovedi alebo notifikácii.
- Predčasné prevzatie účtu — pri verification.secure_on_email_login prihlásenie magic linkom či e-mailovým kódom, ktoré overí neoverenú adresu, odstráni heslo, nastavenie dvojfaktora aj passkeys nastavené pred overením adresy a ukončí všetky relácie (AccountClaimed); uplatnenie je podmienený update v jednej transakcii s upratovaním a prihlásenie heslom v súbehu s ním dostane pár, ktorý sa odmietne.
- Obnova účtu — ochrana posledného prihlasovacieho údaja, vynútené nastavenie faktora len pre overené adresy, zmena e-mailu overená a dvakrát oznámená, obnova hesla nikdy neobíde nastavený druhý faktor a registrácia nikdy nepreskočí povinné nastavenie dvojfaktora.
- Prenos — Cache-Control: no-store na každej odpovedi balíka, šifrované frontované notifikácie a tajomstvá vo fragmentoch URL.
- Stack trace — fasáda Authentication používa RedactsSensitiveArguments z package-toolkit, takže argumenty #[SensitiveParameter] metód consumeMagicLink() ($token), verifyEmailOtp() ($code) a refresh() ($refreshToken) sa aj vo vlastnom rámci fasády zobrazia ako SensitiveParameterValue, kým ostatné argumenty zostanú viditeľné.
Sprísnená predvoľba
Dnešné predvolené hodnoty zachovávajú správanie verzií 1.x/2.x. Medzery, ktoré nechávajú, uzavrú štyri nastavenia — sú to predvolené hodnoty plánované pre ďalšiu major verziu. Nastavte ich na guarde jednotlivo alebo všetky naraz cez GuardPreset::hardened() (pozri Konfigurácia):
| Kľúč | Dnes | Hardened | Čo uzavrie |
|---|---|---|---|
registration.uniform_response | false | true | Registráciu, ktorá prezradí obsadenú adresu, keď by hneď prihlásila. Obsadená adresa dostane presne tú odpoveď ako voľná (accepted alebo verification_required, rovnaká náročnosť hashu) a jej držiteľ upozornenie o existujúcom účte; registrácia nikdy neprihlási. |
verification.mode | optional | required_for_login | Prihlasovanie neoverených účtov — zaregistrovať ľubovoľnú adresu môže ktokoľvek. |
verification.secure_on_email_login | false | true | Predčasné prevzatie účtu: prihlasovacie údaje nastavené pred overením adresy prežijú prvé e-mailové prihlásenie jej vlastníka. verify_on_email_login zostáva true, čo potrebuje. |
lockout.enabled | false | true | Neobmedzené pomalé hádanie hesla z rôznych IP nad rámec limitov. Daň: účet môže ktokoľvek zámerne uzamknúť neúspešnými pokusmi — vlastník dostane upozornenie a lockout.reset_unlocks dovolí zámok zrušiť obnovou hesla. |
Predvoľba nastaví aj verification.verify_on_email_login = true. Všetko ostatné je bezpečné už predvolene — jednotné zamietnutie pri riziku, reveal_account_state až po overenom prvom faktore, URL s fragmentom, kontroly adresy pozvánky.
Poznámky k prechodu na ďalšiu major verziu
Ďalšia major verzia urobí zo štyroch sprísnených hodnôt predvolené. Ak si chcete po prechode ponechať dnešné správanie, nastavte ich explicitne na guarde alebo v defaults:
// Keep today's behaviour after the next major — set on the guard or under defaults
'registration' => ['uniform_response' => false],
'verification' => ['mode' => 'optional', 'secure_on_email_login' => false],
'lockout' => ['enabled' => false],Pred zapnutím si overte, čo zmenia pre vašich používateľov: registrácia už neprihlási (po registrácii ich pošlite na prihlásenie), neoverené účty sa musia pred prihlásením overiť, e-mailové prihlásenie do neovereného účtu odstráni heslo nastavené pred overením (používateľ si ho nastaví znova) a opakované neúspechy uzamknú účet na lockout.duration.
Známe obmedzenia
- Denylist je v cache — jej vyprázdnenie oživí zrušené, ešte platné prístupové tokeny až do ich expirácie. Invalidácie pokrýva verzia tokenu; zvyšok ohraničí krátke access_ttl.
- Vynútené nastavenie faktora — útočník, ktorý pozná len heslo, by si v režime required mohol nastaviť vlastný faktor; zmierňuje to podmienka overenej adresy a notifikácie a výzva, ktorej krok nastavenia zastaral (faktor si medzitým nastavili), sa ukončí.
- Registrácia s okamžitým vydaním tokenov prezradí obsadenú adresu — použite režimy odolné voči enumerácii alebo registration.uniform_response.
- Prevzatie účtu cez overovací odkaz — secure_on_email_login sa nespustí, keď sa adresa overí odkazom či kódom poslaným po registrácii: je to vlastný krok registrujúceho a ten heslo pozná. Ak vlastník adresy klikne na taký odkaz pre účet, ktorý nevytvoril (e-mail mu radí ho ignorovať), predchádzajúce heslo zostane. Pri required_for_login sa pred týmto kliknutím nikto neprihlási.
- Zmena prihlasovacích údajov, ktorá už prebieha — relácia, ktorá prešla overením tesne pred prevzatím (alebo obnovou hesla), môže ešte dokončiť začatú zmenu hesla; prevzatie túto reláciu ukončí, takže potrebuje staré heslo a presne toto okno v rádovo milisekundách.
- Jedna relying party pre passkeys všetkých guardov a jeden typ kľúča pre všetky modely guardov.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.