Come impedire alle persone di abusare del mio endpoint che accetta i file? [duplicare]

2

Quindi ho un'app Django ospitata su Heroku che ha un endpoint che accetta upload di immagini. Le immagini vengono salvate nel mio bucket AWS, che viene addebitato a me. Al momento, sono in grado di caricare immagini effettuando una richiesta multipart con l'app Postman.

Il mio obiettivo è consentire alla mia app Android di accettare upload di immagini dall'utente. Tuttavia, la mia comprensione delle applicazioni Web è molto limitata e non capisco come impedire alle persone di caricare semplicemente file di dimensioni arbitrarie sul mio endpoint e accumulare un grosso addebito sui miei account AWS / Heroku. Dopo tutto, è solo un URL a cui inviare richieste POST. Quindi,

  • Che cosa è un buon modo per impedire alle persone di caricare indiscriminatamente sul mio server, quindi non mi sveglio con una fattura da $ 10k da Amazon?

    • La mia ipotesi cieca è che esiste una pratica di invio dell'autenticazione dal client - Esiste un buon modo per farlo senza che gli utenti debbano passare attraverso un servizio di accesso?
  • Se rovino, i servizi di hosting (come Heroku o Amazon) forniranno una rete di sicurezza per evitare di accumulare spese ingenti?

  • Che cosa fanno i grandi servizi come imgur per impedire alle persone di caricare enormi quantità di dati?

posta Eric S. 31.08.2015 - 19:03
fonte

2 risposte

2

Se i tuoi dati devono essere mantenuti solo in Amazon S3, non è performante eseguirne il proxy tramite il server web e, se possibile, dovrebbero essere evitati.

Quello che puoi fare è creare un criterio POST che contenga vincoli su ciò che l'uploader (la tua app Android può fare).

Potresti creare la seguente politica:

  • Può caricare solo su bucket specifici
  • Specifica la dimensione min / max del file
  • etc

La bellezza di questo è che il tuo server web può generare dinamicamente queste politiche al volo e inviarle al client (app per Android). Forse il tuo utente paga una quantità specifica di spazio di archiviazione, che sarebbe possibile controllare usando questo metodo.

Puoi leggere le norme Post qui: link

Il tuo flusso di lavoro potrebbe essere simile a questo:

  1. L'utente naviga per caricare la visualizzazione nella tua app
  2. L'App fa richiesta al tuo servizio di riposo per recuperare la politica
  3. Criterio di costrutti del servizio di ripristino JSON, base64 lo codifica e lo rimanda
  4. L'app invia dati ad Amazon S3 passando direttamente sulla politica
  5. Amazon leggerà la politica, si assicurerà che non sia stata manomessa e accetta o rifiuta il file in base ai vincoli della politica.

C'è anche questa libreria per Android link ma devi fornire le tue credenziali Amazon S3 che Non penso sia molto sicuro.

    
risposta data 31.08.2015 - 20:54
fonte
0

Puoi provare a limitare le dimensioni e il numero di file che l'utente può inviare alla tua API e utilizzare una strategia per identificare l'applicazione (o il dispositivo) quando ricevi la richiesta come una chiave nell'intestazione della richiesta (ad esempio 'Autenticazione : chiave '). In questo modo è difficile per le persone utilizzare un client REST per pubblicare molti file.

    
risposta data 31.08.2015 - 22:00
fonte

Leggi altre domande sui tag