710 messaggi dal 13 novembre 2008
Contributi
ciao,
in una web app sviluppata con Core alcune immagini e relativi thumbs sono su Azure come Blob privati, sostanzialmente per prevenire l'hotlinking; per visualizzare le immagini originali al caricamento della pagina imposto la SAS sull'url e tutto funziona correttamente. Però:
l'applicazione ha del codice client che in base al dispositivo di visualizzazione setta il thumb corretto, cambiando l'url dell'immagine, per esempio xyz.jpg-->xyz_750.jpg, quindi se il browser viene ristretto, in teoria automaticamente deve caricare il thumb corretto...
come fare però per creare la SAS sui thumbs al momento della loro richiesta?

Ho pensato di utilizzare il codice che crea la SAS con una chiamata ajax, ma così espongo il metodo lato client...

grazie per i suggerimenti
Modificato da teo prome il 15 dicembre 2017 18.51 -
244 messaggi dal 22 gennaio 2017
Contributi
Non è supportato in Azure:
https://stackoverflow.com/questions/13859599/prevent-hotlinking-in-azure-blob-storage

L'unica cosa che puoi fare è proteggere l'endpoint che ti genera il sas.
Mi vengono in mente queste soluzioni:
1) sas con scadenza a brevissimo termine
2) implementazione di protezione dell'endpoint che genera il link. Aggiunta di data annotation con l'impostazione del CORS
3) Aggiunta di un parametro dinamico nell'header della chiamata http. Una password criptabile e decriptabile.
710 messaggi dal 13 novembre 2008
Contributi
Le soluzioni 1 e 2 sono già implementate, SAS 5 minuti e CORS, ma questo non è aggirabile? con una richiesta ad hoc si avrebbe comunque accesso all'endpoint che genera SAS...

la soluzione 3 è interessante: dovrei generare il parametro-password-dinamico (un GUID?) lato server e magari registrarlo a db e renderlo disponibile al client al caricamento della view (senza chiamate ajax), quindi inviarlo assieme alla richiesta ajax per la SAS al variare dei thumbs come header e nel metodo di generazione di SAS ci sarà anche la verifica del parametro....

il parametro dovrebbe poi avere una validità limitata nel tempo

intendevi una cosa simile?

grazie
Modificato da teo prome il 17 dicembre 2017 15.32 -
244 messaggi dal 22 gennaio 2017
Contributi
Ciao teo,
La mia idea era quella di usare tutti e 3 i punti assieme.

Per quanto riguarda il token, potresti generartelo server side (utilizzi MVC?). Anzichè un GUID, potresti generarti una stringa criptata che contenga una data e un'ora.
Quando ti richiedono la risorsa con il token appena generato, vai a verificare se la data del token è inclusa in un intervallo che consideri affidabile (1 minuto? 5 minuti?).
In questo modo, non hai bisogno di accedere al DB.
La criptazione del token e la lettura devono sempre avvenire server side. La logica di validità del token rimane al sicuro ed è solo un onere di calcolo e non di accesso a una risorsa che richiede IO.
Se non ti fidassi del metodo e vorresti sfruttare uno storage di GUID, valuta di portare tutto su un sistema di caching (redis cache?), questo ti consente di ridurre l'onere di mantenere dati e di pulirli dopo un lasso di tempo. Inoltre l'accesso è ottimizzato.

Spero di averti dato qualche idea utile.
Purtroppo l'Azure Storage non protegge da hotlinking.
710 messaggi dal 13 novembre 2008
Contributi
si MVC, mi torna, genero il token lato server lo rendo disponibile al client tramite ViewBag o un qualche metodo di injection, alla richiesta della risorsa invio anche il token e faccio la verifica lato server per restituire il SAS.
Valuterò se usare anche uno storage per il token, pensavo alle tabelle che già sto utilizzando nel progetto e che sono veloci, redis in effetti non mi creerebbe problemi di pulizia successiva

Purtroppo l'Azure Storage non protegge da hotlinking

mannaggia! seconde me è una bella mancanza, come altre d'altronde, v. AWS...

ciao e grazie
Modificato da teo prome il 17 dicembre 2017 18.04 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.