Il design dell'applicazione è semplice:
Input utente > Serializza come JSON > Encrypt sul lato client > Carica sul server
L'oggetto che si sta memorizzando è strutturato in questo modo:
type: <type1|type2|type3>
type_specific_field1: "value1"
type_specific_field2: "value2"
type_specific_field3: "a_very_long_value_such_as_image_data"
Tutto ciò che il server vede è un blob crittografato. Per motivi di privacy, al server non è consentito nemmeno visualizzare type
o i nomi dei campi. L'utente può creare tutti gli oggetti che desidera e ogni oggetto può essere grande (ad esempio 10 MB).
Il problema è che un utente può archiviare dati arbitrari nel blob crittografato e il server non avrebbe modo di verificare se i dati caricati sono o meno un oggetto valido. Potrebbero (ab) utilizzare il server come alternativa di archiviazione su cloud a Dropbox, S3, ecc. Anziché per lo scopo previsto.
Idee per la mitigazione che ho finora:
- Limitazione della velocità di rete per utente / indirizzo IP.
- Limita il numero di oggetti per utente.
- Richiedere una prova di lavoro per ciascun oggetto.
- Richiedi CAPTCHA inserisci ogni oggetto X.
Idee che potrebbero funzionare in casi simili ma non in questo:
- "Prova di spazio" non funzionerà in questo caso perché il client non è tenuto a conservare una copia degli oggetti che carica.
- Anche il pagamento per ogni oggetto o unità di archiviazione non funzionerà in questo caso perché l'applicazione è gratuita.
Le mitigazioni che ho elencato aiutano sicuramente ma non eliminano la possibilità di abusi e ognuna ha effetti dannosi per gli utenti legittimi.
C'è un modo per il client di provare, o il server per verificare, che il blob crittografato contiene un oggetto valido? O altre mitigazioni crittografiche, a livello di rete o a livello di applicazione a cui puoi pensare?