Race condition e TOCTOU: la finestra tra controllo e uso
Una race condition nasce quando due operazioni concorrenti agiscono sullo stesso stato e il risultato dipende dall'ordine. Time-Of-Check to Time-Of-Use: verifichi una condizione, ma tra il controllo e l'uso qualcosa cambia.
L'attacco
Invia molte richieste in parallelo nell'istante giusto (single-packet attack per allineare l'arrivo). Esempi: riscattare un coupon N volte perché tutte le richieste vedono "non ancora usato"; prelevare più del saldo perché i controlli leggono lo stesso valore prima dell'aggiornamento.
# 20 richieste simultanee a /redeem?code=X
# tutte passano il check "code valido e non usato" prima del decrementoDifesa
Rendi atomica la sequenza check-then-act: transazioni con lock (SELECT ... FOR UPDATE), operazioni atomiche del DB (decremento condizionale UPDATE ... WHERE balance >= n), vincoli di unicità, o lock distribuiti. Idempotenza sulle operazioni sensibili.