Ho un servizio che offre un bene fisico in cambio di denaro o tramite il codice fornito da noi. È possibile accedere al servizio tramite un'applicazione mobile.
I codici hanno restrizioni d'uso, ad esempio per essere usati solo una volta per utente. Ciò si ottiene inviando un identificativo univoco con la richiesta per verificare se l'utente è autorizzato a utilizzare il codice oppure no.
Questa soluzione ovviamente funziona solo nel mondo perfetto, dove nessuno decodifica la tua API.
Ciò che voglio impedire è che un utente malintenzionato inverta la progettazione della nostra API rivolta pubblicamente e ordini un'enorme quantità di beni che danneggiano gravemente il business.
Il sistema attuale ha impedito questo avendo diversi controlli in atto:
- ID univoco per utente, generato sul dispositivo (bypass: generato un UUID casuale su ogni richiesta malevola)
- rate limiting, a un singolo IP è permesso inviare solo X richieste per Y minuti (bypass: dal momento che l'IP acquisito attraverso le intestazioni HTTP, questo dovrebbe essere abbastanza facile da spoofare, e ovviamente entrerà solo dopo che c'è già alcuni considerevoli danni fatti)
Come posso assicurarmi che questo non sia abusato?
Le uniche due soluzioni che ho potuto trovare sono:
- non fare mai sconti completi, fai solo sconti parziali (come il 50% di sconto), che richiederebbe che l'attaccante paghi ancora per ogni bene, riducendo l'incentivo.
- avere account, che richiederebbero più passaggi, riducendo anche l'incentivo.
E ad essere onesti, non voglio fare nessuno di questi.
Modifica 1:
L'identificativo univoco viene generato sul dispositivo, su iOS IDFA viene utilizzato, su Android il ANDROID_ID
. Vengono inviati come testo normale su HTTPS al server, per identificare l'utente. Se un utente malintenzionato desidera riprodurre la richiesta per ordinare le merci, deve solo cambiare questo identificativo e il server lo accetterà volentieri come un nuovo ordine.