Ho una tabella del database File con le seguenti colonne:
Id (PK), Filename
E una tabella del database dei documenti con le seguenti colonne:
Id (PK), Name, Description, FileId (FK)
Quando un utente vuole "salvare" un documento, il mio JavaScript sul lato client lo fa in due chiamate AJAX rapide (nel tentativo di essere RESTful e salva ogni risorsa individualmente):
-
Carica il file che hanno selezionato. Questo creerà un record File nel database e il client riceverà il suo ID in risposta.
-
Salva il documento con i dati specificati (Nome, FileId, ecc.). Questo creerà / aggiornerà un record di documento nel database.
Dispongo di un servizio che consente a un utente di scaricare un file, a condizione che specifichi il suo ID. Tuttavia, nel servizio esiste una certa logica di sicurezza che controlla se un utente ha permesso per scaricare il file, controllando se vi è almeno un'entità "di database" ad essa associata a cui l'utente ha accesso . Ad esempio, un documento sarebbe una di queste entità. Quindi, se un utente può accedere a un particolare documento (determinato da alcune regole aziendali, ma diciamo solo che più utenti possono accedere allo stesso documento), può scaricare il suo file.
Questo sembra tutto bene in superficie, ma c'è un problema . Il processo di salvataggio in due passaggi per un documento è tutto Javascript sul lato client, quindi un hacker potrebbe facilmente modificare il passaggio 2 in modo che qualsiasi FileId arbitrario venga inviato al server. Questo assocerebbe quindi quel file al documento, quindi in seguito l'utente avrà il permesso di scaricarlo!
Quali sono alcuni modi in cui posso risolvere questo problema?