NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Two-Factor for Laravel

Ochrana proti opakovaniu

Po prijatí TOTP kódu sa jeho časový krok zaberie jedinou operáciou check-and-set. Každý kód s časovým krokom rovnakým alebo starším než posledný úspešný sa odmietne a vyvolá sa TwoFactorReplayDetected s daným krokom — dve súbežné odoslania toho istého kódu teda nemôžu uspieť obe. Zaberá sa aj kód použitý na potvrdenie aktivácie.

Výber guardu

// config/two-factor.php
'replay_guard' => 'cache',   // 'column' | 'cache' | 'none' (null → none)
'cache' => [
    'store' => env('TWO_FACTOR_CACHE_STORE'),
    'ttl' => 60 * 60 * 24,
],
RežimGuardAko zaberá krok
columnColumnReplayGuardPredvolený — aj pri prázdnej hodnote replay_guard. Jeden podmienený UPDATE nad stĺpcom posledného časového kroku; nula zmenených riadkov znamená opakovanie. Uložené spolu s riadkom účtu.
cacheCacheReplayGuardZaberá krok pod atomickým zámkom úložiska cache (Redis, Memcached, database, file aj array ho poskytujú); úložiská bez zámkov obslúži náhradnou cestou bez záruky atomicity.
none / nullNullReplayGuardKaždé zabratie uspeje — ochrana proti opakovaniu je vypnutá.

Ak na viacuzlovom hostingu zvolíte cache guard, použite atomický store, napríklad Redis alebo databázu.

Upozornenie pri cache guarde

Vyprázdnenie alebo vyradenie cache (cache:clear, deploy, tlak LRU) zmaže posledný použitý časový krok a na chvíľu znova otvorí okno pre opakovanie. Ak je toto riziko neprijateľné, použite predvolený guard column, ktorý ukladá krok do tabuľky účtu.

Vlastný guard

Ak chcete časové kroky ukladať inde, zaregistrujte vlastnú implementáciu kontraktu ReplayGuard:

// The contract — RoundlyConsulting\TwoFactor\Contracts\ReplayGuard
interface ReplayGuard
{
    // The latest recorded timestep (null when none yet).
    public function latestTimestep(TwoFactorAuthenticatable&Model $user): ?int;

    // Atomic check-and-set: true when newly claimed, false on a replay.
    public function claim(TwoFactorAuthenticatable&Model $user, int $timestep): bool;
}

// In a service provider's register():
$this->app->singleton(ReplayGuard::class, fn () => new MyReplayGuard);

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 kryptomien

Odoslaní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.