228 messaggi dal 01 agosto 2003
Ciao a tutti
avevo bisogno di impedire l'accesso diretto ai miei documenti on line (jpg, pdf ecc...)
Dopo avere invano provato molteplici cose (web confing, dati binari ecc....) e non esservi riuscito.

Ho provato questa soluzione.

Nel momento in cui si fa l'upload di un documento, gli si cambia il nome. Ovvero gli modifico l'estensione mettendo caratteri che non centrano nulla.
Ho visto che cercadoli con la URL non si riescono a visualizzare e scericare.

Poi, nel momento in cui servono a me, faccio un cambio nome al volo e li visualizzo.

Ora chiedo a voi piu' esperti di me.

Che ne dite di questa soluzione? Rende i miei documenti piu' sicuri?

Grazie delle vostre considerazioni preziose

victor
3.938 messaggi dal 28 gennaio 2003
Ciao, vorrei fare una domanda: questi documenti li può scaricare solo un utente autenticato?

Pietro
228 messaggi dal 01 agosto 2003
Ciao
si certo.

I documenti esistono nella mia cartella del dominio.

Se io mi autentico li riesco a visualizzare in quanto nel momento in cui li vedo
la mia aspx cambia il nome e me li fa visualizzare.

Se per caso qualcuno riesce via url ad intercettare il documento non riuscirebbe lo stesso a scaricarlo in quanto ha il nome cambiato con un estensione errata

Che ne pensi?
vuoi che ti mandi un esmepio?

victor
3.938 messaggi dal 28 gennaio 2003
Ciao.
Ti dico come faccio io.
Metto i files in un directory che non è una directory virtuale, per esempio, c:\dati\documenti
Questo vuol dire che non posso accedere a un file come:
http://miosito/miofile.pdf

per accedere mi creo un gestore generico ashx che si occuperà di acquisire il file e restituirlo al chiamante:

http://miosito/handler.ashx?file=miofile.pdf

la pagina handler.ashx può essere richiamata solo da un utente autenticato che ha i privilegi per accedere alla risorsa.

I files possono essere archiviati o nel file system o in database, non ha nessuna importanza

Pietro
228 messaggi dal 01 agosto 2003
Pietro tu sei troppo avanti rispetto a me :-)

pero' caricando i file nel database non lo appesantisci troppo ?

victor
3.938 messaggi dal 28 gennaio 2003
Guarda, Google è molto migliorato in questi anni. Posso mischiare italiano e inglese maccheronico e mi trova quello che cerco.
La scelta dove salvare il documento dipende da te. Figurati se Oracle (che uso) si mette questi problemi. E poi dipende dal contesto.
Per esempio, in una anagrafica mi pare giusto salvare il documento in un campo blob del database, in altri contesti no.

Se mi viene bene ti faccio un esempio.

Pietro
3.938 messaggi dal 28 gennaio 2003
Ti mando un esempio. Se ti va studiatelo.

Metto i files in una directory chiamata "c:\dati\test"

Creo con visual studio un gestore generico shx, che non è altro che una pagina senza interfaccia. Questo il codice.
<%@ WebHandler Language="VB" Class="Handler_generico" %>

Imports System
Imports System.Web
Imports MimeTypes

Public Class Handler_generico : Implements IHttpHandler

    'directory archivio file
    Const percorso As String = "c:\dati\test"
    
    Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        Try
            'recupero il nome del file che voglio ottenere
            Dim file = RequestParams("file")
            If String.IsNullOrWhiteSpace(file) Then Throw New Exception("Bisogna passare il parametro file che contiene il nome del file")
            
            Dim percorso_file As String = Path.Combine(percorso, file)
            If Not IO.File.Exists(percorso_file) Then Throw New Exception(String.Format("il file {0} non esiste", file))
            
            Dim estensione As String = Path.GetExtension(file)
            
            'leggo il file in un vettore di byte
            Dim buffer As Byte() = IO.File.ReadAllBytes(percorso_file)
            
            'restituisco al chiamante il file col suo nome e il giusto mime
            context.Response.Clear()
            context.Response.ContentType = MimeTypeMap.GetMimeType(estensione)
            context.Response.AppendHeader("Content-Disposition", String.Format("filename=""{0}""", file))
            context.Response.BinaryWrite(buffer)

            
            
                
            



        Catch ex As Exception
            'se errore restituisco il messaggio di errore
            context.Response.Clear()
            context.Response.ContentType = "text/plain"
            context.Response.Write(ex.Message)

        End Try

    End Sub

    Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property




    '--------------------------------------------------------------------------------------------------
    'Restituisce il parametro Form se esiste, altrimenti il parametro querystring se esiste, oppure ""
    '--------------------------------------------------------------------------------------------------
    Public Function RequestParams(nome As String) As String
        Dim s As String = Trim(System.Web.HttpContext.Current.Request.Form(nome))

        If s = "" Then
            Return Trim(System.Web.HttpContext.Current.Request.QueryString(nome))
        Else
            Return s
        End If
    End Function



End Class


per trovare ContentType uso la libreria https://www.nuget.org/packages/MediaTypeMap/
però, per fare esperimenti, puoi usare questi:
'application/octet-stream
'application/pdf
'application/zip
'application/json
'application/xml
'image/jpeg
'image/png
'text/plain
'text/html
'text/csv
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet


si richiama come:
http://localhost/ArchivioEsempi/Handler_generico.ashx?file=prova.pdf

Pietro
228 messaggi dal 01 agosto 2003
Ciao Pietro
sempre (da anni) gentilissimo.

Poi mi studio il tuo codice.

Ti chiedo una cortesia veloce (non centra nulla ma in questo momento ne ho bisogno)

ho una drop che aggancia i dati da un db

    dim objcmd_ver34dsmitns as new oledbcommand (" select  * from "& request.Cookies("tabella_indirizzata").value &" where movimento='scrittura mastrino liste' ")

    dim objcmd as new oledbdataadapter ("select distinct  data from "& request.Cookies("tabella_indirizzata").value &" where movimento='scrittura mastrino liste'   ", objconn)
    dim ds as dataset=new dataset()
    objcmd.fill (ds,"data")
    
Dim strSQL as String = "select distinct  data from "& request.Cookies("tabella_indirizzata").value &" where movimento='scrittura mastrino liste'  "

Dim objCmd2 as OleDbCommand
objConn.Open()
objCmd2 = new OleDbCommand(strSQL, objConn)
dim MyCommand As New OledbDataAdapter(strSQL,objConn)
ds = new DataSet()
MyCommand.Fill(ds, "data")
objConn.Close
anno_scolastico.DataTextField="data" ' campo visualizzato
anno_scolastico.DataValueField="data" ' campo di valore
anno_scolastico.DataBind()
anno_scolastico.DataSource=ds
anno_scolastico.DataMember="data"
anno_scolastico.DataTextField="data" ' campo visualizzato
anno_scolastico.DataValueField="data" ' campo di valore
anno_scolastico.DataBind()



Devo fare un replace del campo data
cioe' devo fare in modo che vebga tolta una certa scritta prelevata dal db

DOVE METTO IL REPLACE?
e soprattutto in che modo lo metto?
se faccio il classico replace(data ecc.?
mi da errore

Grazie 1000
Modificato da victor8872 il 18 luglio 2020 21:04 -

victor

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.