---
title: "Ochrana proti opakovaniu — Two-Factor for Laravel | Roundly"
description: "Každý prijatý kód atomicky zaberie svoj časový krok, takže zachytený kód sa nedá znova použiť — v stĺpci, v cache alebo vo vlastnom guarde."
url: https://roundly-consulting.com/sk/open-source/navody/two-factor-for-laravel/ochrana-proti-opakovaniu
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Two-Factor for Laravel](https://roundly-consulting.com/sk/open-source/navody/two-factor-for-laravel.md)

# 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

```php
// config/two-factor.php
'replay_guard' => 'cache',   // 'column' | 'cache' | 'none' (null → none)
'cache' => [
    'store' => env('TWO_FACTOR_CACHE_STORE'),
    'ttl' => 60 * 60 * 24,
],
```

| Režim | Guard | Ako zaberá krok |
| --- | --- | --- |
| `column` | `ColumnReplayGuard` | Predvolený — 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. |
| `cache` | `CacheReplayGuard` | Zaberá 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 / null` | `NullReplayGuard` | Kaž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.

cache.ttl musí prežiť platnosť kódu: aspoň (2 × window + 1) × period sekúnd, pri predvolených hodnotách 90. Kratšia hodnota vyhodí pri načítaní cache guardu InvalidTwoFactorConfigException — inak by záznam vypršal ešte počas platnosti zabratého kódu a ten istý kód by sa prijal znova.

## 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:

```php
// 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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/two-factor-for-laravel.md)
