84 messaggi dal 07 settembre 2009
Salve a tutti
premetto che ho cercato per circa un paio d'ore la soluzione sia sul forum tramite "cerca" sia in internet senza però trovare soluzioni esaurienti.

il mio problema è questo: stò realizzando un'area riservata in cui ogni utente ha la sua cartella all'interno della quale può tranquillamente caricare file e creare nuove sotto cartelle che possono contenere a loro volta file e sottocartelle, ed ho bisogno di impedire sia l'accesso diretto ai file permettendolo solo tramite link sia di impedire l'accesso al file senza autenticazione.

come autenticazione utilizzo il form authentication di asp.net che funziona bene per le pagine ma non per i file... per come è stato concepito il funzionamento dell'area riservata, ovvero che permette di creare sottocartelle a non finire, devo tener costantemente traccia del percorso della directory in cui mi trovo in quel momento (ovviamente a partire da un certo livello in poi), quindi la soluzione di nascondere l'indirizzo tramite una pagina ricavando l'id del file è fuori questione perchè una persona con un minimo di furbizia non farebbe troppa fatica a scoprire il percorso completo del file.
inoltre non so se è dipende dal browser o dal fatto che sono un nabbone ma attualmente quando accedo ad un file (txt in questo caso) visualizzo direttamente il contenuto quando invece io voglio permetterne solo il download (questo con tutti i formati possibilmente che sono limitati a zip pdf txt rar doc docx e affini).

Grazie in anticipo per il vostro aiuto

Davide
Modificato da doppiomango il 01 marzo 2010 12.43 -
doppiomango wrote:
come autenticazione utilizzo il form authentication di asp.net che funziona bene per le pagine ma non per i file... per come è stato concepito il funzionamento dell'area riservata, ovvero che permette di creare sottocartelle a non finire, devo tener costantemente traccia del percorso della directory in cui mi trovo in quel momento (ovviamente a partire da un certo livello in poi), quindi la soluzione di nascondere l'indirizzo tramite una pagina ricavando l'id del file è fuori questione perchè una persona con un minimo di furbizia non farebbe troppa fatica a scoprire il percorso completo del file.

infatti questa non è security, è solo pensare che dall'altra parte uno non veda oltre la siepe...

inoltre non so se è dipende dal browser o dal fatto che sono un nabbone ma attualmente quando accedo ad un file (txt in questo caso) visualizzo direttamente il contenuto quando invece io voglio permetterne solo il download (questo con tutti i formati possibilmente che sono limitati a zip pdf txt rar doc docx e affini).

devi fare un HttpHandler e registrarlo. perchè funzioni, devi mappare . sotto ASP.NET, da IIS, oppure se usi IIS 7 utilizzare l'integrated pipeline. a quel punto, puoi decidere che i file sotto un dato percorso sono mappati sotto questo handler, per capire cosa farne. qui trovi un'idea: http://www.aspitalia.com/script/720/HttpHandler-FormsAuthentication-File-Estensione.aspx
rispetto a questo, per renderlo generico devi utilizzare le header specifiche. qui trovi un esempio:
http://www.aspitalia.com/script/510/Rendere-Sicuro-Download-Files-ASP.NET.aspx .

Daniele Bochicchio (ASPItalia.com)
I libri su HTML5, WP7, ASP.NET 4.0, VB 2010, C# 4, Entity Framework
Senior Software Architect @ 5DLabs.it
84 messaggi dal 07 settembre 2009
Grazie per la risposta

se ho capito bene l'HttpHandler serve solo per evitare di aprire il file sul browser e non per impedirne un download diretto giusto?

poi per farlo funzionare non ho ben capito cosa bisogna fare, se basta metterlo in una directory App_Code e aggiungere le estensioni sul web.config o se c'è altro da fare (è la prima volta che ho a che farci) e non so se devo dargli qualche nome specifico o basta rinominarlo ASPItalia.com.Handlers.aspx .

per quanto riguarda poi il discorso security esiste un modo "concreto" per impedire il download diretto? o non è mai possibile?
aggiungo anche che ho dovuto creare un database che contiene nomi e percorsi di tutti i file uploadati se la cosa può essere d'aiuto

Grazie per l'aiuto
Davide


p.s.
una domanda stupida che non riguarda l'argomento ma già che ci siamo ne approfitto
è possibile conoscere l'id di una riga del database (sql server 2005) al momento della creazione con INSERT senza dover reinterrogare il database con il SELECT? visto che il database risulterà molto pieno non vorrei appesantire le pagine con troppi richiami al database dove è possibile evitarlo.
oppiomango wrote:
se ho capito bene l'HttpHandler serve solo per evitare di aprire il file sul browser e non per impedirne un download diretto giusto?

no, devi fare entrambe le cose: proteggere e cambiare le header.
poi per farlo funzionare non ho ben capito cosa bisogna fare, se basta metterlo in una directory App_Code e aggiungere le estensioni sul web.config o se c'è altro da fare (è la prima volta che ho a che farci) e non so se devo dargli qualche nome specifico o basta rinominarlo ASPItalia.com.Handlers.aspx .

dai una lettura a come funzionano gli HttpHandler:
http://msdn.microsoft.com/it-it/library/cc185070.aspx

per quanto riguarda poi il discorso security esiste un modo "concreto" per impedire il download diretto? o non è mai possibile?

rileggi la mia risposta

una domanda stupida che non riguarda l'argomento ma già che ci siamo ne approfitto
è possibile conoscere l'id di una riga del database (sql server 2005) al momento della creazione con INSERT senza dover reinterrogare il database con il SELECT? visto che il database risulterà molto pieno non vorrei appesantire le pagine con troppi richiami al database dove è possibile evitarlo.

con una stored procedure hai la certezza che sia fatto in transazione, ma da un certo punto di vista non cambia nulla riguardo al carico. il db serve per questo, non per fargli prendere la polvere
.

Daniele Bochicchio (ASPItalia.com)
I libri su HTML5, WP7, ASP.NET 4.0, VB 2010, C# 4, Entity Framework
Senior Software Architect @ 5DLabs.it
84 messaggi dal 07 settembre 2009
Daniele Bochicchio ha scritto:
doppiomango wrote:
se ho capito bene l'HttpHandler serve solo per evitare di aprire il file sul browser e non per impedirne un download diretto giusto?

no, devi fare entrambe le cose: proteggere e cambiare le header.
poi per farlo funzionare non ho ben capito cosa bisogna fare, se basta metterlo in una directory App_Code e aggiungere le estensioni sul web.config o se c'è altro da fare (è la prima volta che ho a che farci) e non so se devo dargli qualche nome specifico o basta rinominarlo ASPItalia.com.Handlers.aspx .

dai una lettura a come funzionano gli HttpHandler:
http://msdn.microsoft.com/it-it/library/cc185070.aspx


grazie mi serviva proprio una guida a riguardo che mi sarà utile anche per altri progetti vecchi e futuri ;)

cmq con questo metodo è ancora possibile scaricare il file da link diretto se si conosce il vero percorso, se non ho capito male, ma lo si nasconde dietro un link virtuale che creo con l'httphandler rendendo più difficile indovinarlo


una domanda stupida che non riguarda l'argomento ma già che ci siamo ne approfitto
è possibile conoscere l'id di una riga del database (sql server 2005) al momento della creazione con INSERT senza dover reinterrogare il database con il SELECT? visto che il database risulterà molto pieno non vorrei appesantire le pagine con troppi richiami al database dove è possibile evitarlo.

con una stored procedure hai la certezza che sia fatto in transazione, ma da un certo punto di vista non cambia nulla riguardo al carico. il db serve per questo, non per fargli prendere la polvere  .


lol lo so che il db serve a quello ma ho la mania del risparmio e piuttosto preferisco aprirmi il cranio per vedere cosa c'è dentro (sempre che sia rimasto qualcosa) che fare un lavoro non ottimizzato (nei limiti delle mie conoscenze ovviamente)

a livello di complessità quindi fare un'interrogazione ad un database (di dimensione x) o farne 5 è la stessa cosa? (perchè ricordo che nelle complessità si considera 1,x,x^2... quindi 5x=x)
[scusate l'ot]

edit: tornando al discorso httphandler ho un errore che non riesco a risolvere causa ignoranza sull'argomento
"Impossibile caricare il tipo 'ASPItalia.com.Handlers.ProtectedContentHandler' dall'assembly 'App_Code'."
il file si chiama ASPItalia.com.Handlers.ascx ed è la copia di quello che è scritto su http://www.aspitalia.com/script/720/HttpHandler-FormsAuthentication-File-Estensione.aspx, che è ciò che mi serve considerando che limito il numero di estensioni permesse nell'upload, e si trova nella cartella App_Code nella root del sito, nel web.config ho inserito tra i tag <httpHandlers>
<add verb="*" path="*.zip" type="ASPItalia.com.Handlers.ProtectedContentHandler, App_Code" />
che è la riga che genera l'errore.
sapreste dirmi perchè e come risolvere il problema?

grazie ancora

Davide
Modificato da doppiomango il 03 marzo 2010 11.38 -
doppiomango wrote:
cmq con questo metodo è ancora possibile scaricare il file da link diretto se si conosce il vero percorso, se non ho capito male, ma lo si nasconde dietro un link virtuale che creo con l'httphandler rendendo più difficile indovinarlo

no. con questa tecnica fai in modo che, sapendo o non sapendo l'indirizzo diretto, tu possa controllare a chi, quando e come servirlo. che è ben diverso.

a livello di complessità quindi fare un'interrogazione ad un database (di dimensione x) o farne 5 è la stessa cosa? (perchè ricordo che nelle complessità si considera 1,x,x^2... quindi 5x=x)

qui non parliamo di complessità, ma di performance e consistenza dei dati. da questo punto di vista è molto meglio farlo in transazione che in uno degli altri 300 mila modi diversi in cui pensandoci sarebbe possibile farlo. il problema è che a certe domande abbiamo già dato risposta da tempo, per cui sarebbe meglio concentrarsi su altro nella vita  .

Daniele Bochicchio (ASPItalia.com)
I libri su HTML5, WP7, ASP.NET 4.0, VB 2010, C# 4, Entity Framework
Senior Software Architect @ 5DLabs.it
84 messaggi dal 07 settembre 2009
Daniele Bochicchio ha scritto:
doppiomango wrote:
cmq con questo metodo è ancora possibile scaricare il file da link diretto se si conosce il vero percorso, se non ho capito male, ma lo si nasconde dietro un link virtuale che creo con l'httphandler rendendo più difficile indovinarlo

no. con questa tecnica fai in modo che, sapendo o non sapendo l'indirizzo diretto, tu possa controllare a chi, quando e come servirlo. che è ben diverso.


ma con questo httphandler che stò utilizzando in particolare o in generale?

cmq per il problema che mi si è presentato sai dirmi come risolverlo?


"Impossibile caricare il tipo 'ASPItalia.com.Handlers.ProtectedContentHandler' dall'assembly 'App_Code'."
il file si chiama ASPItalia.com.Handlers.ascx ed è la copia di quello che è scritto su http://www.aspitalia.com/script/720/HttpHandler-FormsAuthentication-File-Estensione.aspx, che è ciò che mi serve considerando che limito il numero di estensioni permesse nell'upload, e si trova nella cartella App_Code nella root del sito, nel web.config ho inserito tra i tag <httpHandlers>
<add verb="*" path="*.zip" type="ASPItalia.com.Handlers.ProtectedContentHandler, App_Code" />
che è la riga che genera l'errore.
doppiomango wrote:
ma con questo httphandler che stò utilizzando in particolare o in generale?

con un qualsiasi handler. sei tu che scrivi il codice e che decidi cosa farne.

il file si chiama ASPItalia.com.Handlers.ascx ed è la copia di quello

si deve chiamare .cs, non .ascx. è una classe, non uno user control. e deve stare sotto App_Code. in realtà in App_Code in produzione non ci terrei niente, ma farei sempre una class library, da referenziare. ma questo è un altro discorso.
.

Daniele Bochicchio (ASPItalia.com)
I libri su HTML5, WP7, ASP.NET 4.0, VB 2010, C# 4, Entity Framework
Senior Software Architect @ 5DLabs.it

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.
In primo piano

I più letti di oggi

Media
In evidenza
MISC