Condividi:        

[ASP e ASP.NET] Variabili di sessione

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Anthony47, Triumph Of Steel, archimede

[ASP e ASP.NET] Variabili di sessione

Postdi fiorella.fortunato » 30/10/06 10:42

Salve a tutti. Sto creando su un mio sito la possibilità di accedere tramite username, password e password grafica.

Ho creato già un programma .ASPX che crea la password grafica ma la password la dovrebbe prendere da una variabile di sessione passata da un file .ASP

Nel codice del file asp ho scritto (qui sintetizzo) le seguenti righe di codice:
Codice: Seleziona tutto
<% Session("graficpassword")="Prova" %>
...
<img src=/pwd.aspx>
...

Ora nel file .ASPX mi limito semplicemente ad inserire (sempre in sintesi)
Codice: Seleziona tutto
<%@ Page Language="C#"%>
<%@ Import Namespace="System.Drawing" %>
<script runat="server">
 void Page_Load(Object sender,EventArgs e){
  string tst = Session["graficpassword"].ToString(); <=== QUESTA RIGA MI DA' ERRORE
...
 }
</script>

Ho ottenuto questo errore:
System.NullReferenceException: Object reference not set to an instance of an object.
Non conosco bene il linguaggio C# per cui ho difficoltà a capire dove ho sbagliato.

La mia difficoltà è in pratica quella di riuscire a passare una variabile di sessione da ASP a ASPX.

Grazie a chi saprà aiutarmi.
Fiorella Fortunato
- Il 99% dei problemi di un computer sta tra la sedia e la tastiera...
Avatar utente
fiorella.fortunato
Utente Junior
 
Post: 59
Iscritto il: 11/09/05 11:38

Sponsor
 

Postdi tekanet » 30/10/06 12:02

Asp ed Asp.NET non condividono le stesse variabili di sessione poiché girano all'interno di processi diversi sul server che li esegue. Devi trovare un altro modo per il passaggio di dati, sorry! Puoi farlo via querystring, ad esempio. Oppure scrivendo e leggendo da un DB o un file di testo..

HTH, tK
tekanet
Utente Senior
 
Post: 173
Iscritto il: 03/09/02 10:22
Località: Milano sud-ovest

Postdi tekanet » 30/10/06 12:04

Ah, dimenticavo: il nullreference viene su perché cerchi di accedere ad un oggetto (la tua session) non impostato (l'hai impostato da Asp ma, come detto, non è "visto" da Asp.NET).
tekanet
Utente Senior
 
Post: 173
Iscritto il: 03/09/02 10:22
Località: Milano sud-ovest

Postdi fiorella.fortunato » 30/10/06 12:27

Grazie.

Sospettavo una risposta del genere anche se speravo il contrario. :cry:

La querystring la escluderei: impostarne una tipo pwd.aspx?password=prova mi sembra illogica perchè annullerebbe lo scopo per cui è stata effettuata la password grafica.

Potrei demandare al file ASP la creazione contemporanea della variabile di sessione contenente la password creata al momento e di un file ASPX temporaneo con già dentro la password stessa ed eseguire sul browser il nuovo file creato. Potrebbe essere fattibile una cosa del genere?

Grazie per la disponibilità.
Fiorella Fortunato
- Il 99% dei problemi di un computer sta tra la sedia e la tastiera...
Avatar utente
fiorella.fortunato
Utente Junior
 
Post: 59
Iscritto il: 11/09/05 11:38

Postdi tekanet » 30/10/06 12:32

Mh.. non ho ben capito la tua idea!

Se non prevedi 2000 iscrizioni al secondo, credo che una buona opzione sia quella di generare la password grafica nel file ASP, scriverla sul DB, ottenere dal DB l'ID assegnato al record su cui è scritta la password, passare l'ID al file aspx, leggere dal file aspx il record corrispondente all'ID passato via querystring.. non so se può andarti bene! Comunque spiega pure la tua idea!

tK
tekanet
Utente Senior
 
Post: 173
Iscritto il: 03/09/02 10:22
Località: Milano sud-ovest

Postdi fiorella.fortunato » 30/10/06 16:00

Forse sì non mi sono spiegata bene. Ma cercherò di farlo meglio.

Nel file ASP (è una form con una login) c'è come prima cosa una funzione che crea una variabile di sessione contenente una password inventata al momento dal computer come per esempio un insieme di lettere/numeri.

Nello stesso file inserisco subito dopo una funzione che crea un file aspx contenente un'ulteriore stringa con quella password e tutte le istruzioni per creare un file .JPG contenente il disegno della password stessa.

Quando il browser del client chiama la pagina ASP l'utente la vede già tradotta in pagina web in forma di una maschera di login.

Teoricamente un istante prima di visualizzare l'immagine password tramite il tag <img src=/pwd.aspx> il server dovrebbe aver già creato il file ASPX pronto per essere richiamato dal tag d'immagine. Elimino in questo modo il problema del paggssaggio di una variabile di sessione da ASP a ASPX.

Il sito non è un sito dove ci sono migliaia di accessi al giorno (un centinaio nel mio caso forse sono già troppi)...

Potrebbe succedere sì che più utenti si connettano in contemporanea ma ho pensato che il problema potrebbe essere marginale: se per caso l'utente inserisce una password sbagliata il file ASP ripropone la schermata di login con una nuova password grafica.
Fiorella Fortunato
- Il 99% dei problemi di un computer sta tra la sedia e la tastiera...
Avatar utente
fiorella.fortunato
Utente Junior
 
Post: 59
Iscritto il: 11/09/05 11:38

Postdi tekanet » 30/10/06 16:18

Uhm.. se il tuo file aspx cambia il content-type per renderizzare un'immagine (cosa che credo faccia già), è sufficiente dirgli cosa generare. Perciò, se tu invece di richiamare <img src=/pwd.aspx> richiami <img src=/pwd.aspx?ID=123>, dove 123 è l'ID di un database in cui il nome da generare sotto forma di immagine è immagazzinato.. allora ti risulta facile, nel file aspx, inserire una funzione che carica dal DB il nome da generare facendo una semplice SELECT NomeImmagine FROM tabella WHERE ID = Request.Querystring("ID")..

Se questa soluzione non è applicabile per te, di scelte non ne vedo altre al momento.. la tua soluzione ha si il problema della contemporaneità, ma anche quello della sincronia.. come lo generi? Potresti fare una funzione in entrambi i linguaggi che dall'orario del server ottenga, tramite qualche passaggio che ti inventi, una stringa. Scrivendo la medesima funzione su entrambe le pagine, con un margine ristretto di errore dovresti potercela fare (ad esempio considerando solo data, ore e minuti). Un pò come funzionano i token per gli accessi agli home banking, dove sia il server sia il token hanno la medesima funzione "incorporata"..
tekanet
Utente Senior
 
Post: 173
Iscritto il: 03/09/02 10:22
Località: Milano sud-ovest

Postdi fiorella.fortunato » 30/10/06 19:03

Come ti dicevo nel precedente post, purtroppo ho il problema che non conosco appieno il linguaggio C# per cui già scarto a priori la gestione di un db con tale linguaggio.
La mia era solo un'idea. Volevo solo provarla stasera e poi ti faccio sapere.
Per il momento grazie. Terrò comunque buon consiglio di ciò che mi hai scritto.
Fiorella Fortunato
- Il 99% dei problemi di un computer sta tra la sedia e la tastiera...
Avatar utente
fiorella.fortunato
Utente Junior
 
Post: 59
Iscritto il: 11/09/05 11:38

Postdi tekanet » 30/10/06 20:35

Ok, in bocca al lupo! In ogni caso, non scartare a priori l'ipotesi del passare via querystring direttamente la frase da visualizzare. E' vero che è una "falla", ma tutto sommato controllata.. quelle immagini vengono messe per evitare i sistemi automatici generici, per aggirarlo bisognerebbe farne uno apposta e se il sito non è particolarmente appetitoso, credo che nessuno si metta lì a sviluppare qualcosa per bucartelo!

Tra l'altro mi è venuto in mente che c'è uno script "pure asp" che gira sul forum di html.it, mi pare che l'autore sia iMente, che sopperisce a questo (odioso) problema.

Buona caccia!

tK
tekanet
Utente Senior
 
Post: 173
Iscritto il: 03/09/02 10:22
Località: Milano sud-ovest

Postdi fiorella.fortunato » 04/11/06 09:08

Può darsi che nessuno sviluppi sistemi per bucare il sito. O forse no. Credo che nessuno esca di casa senza chiudere la porta a chiave pensando che nessuno gli entrerà mai in casa semplicemente perchè non c'è nulla da rubare. Però ammetterai che se quacuno ti entra nel sito e fa danni la cosa non fa piacere in quanto qualcuno o qualcosa ha violato un qualcosa di tuo. Ogni webmaster ha diritto di ingegnarsi in qualcosa che possa essere efficace per salvaguardare i contenuti dei propri siti. :)

C'era una cosa a cui non avevo pensato... l'ultimo post che avevi inserito mi ha fatto pensare tanto ed alla fine sono giunta ad una conclusione senza usare ASPX ma usando solo ASP. Immagine e variabile di sessione vengono create insieme. La risoluzione del problema è indubbiamente complessa, non fa uso di db, non fa uso di querystring e non crea file temporanei, ma quello che per me è importante è che funziona!!! Consiste nel:

- Dichiarare la seguente riga di codice Response.ContentType = "image/gif" in questo modo dichiariamo al browser client che gli stiamo trasmettendo un'immagine GIF.

- Creare in un array byte x byte il disegno dell'immagine che voglio creare. Ogni pixel corrisponde a un punto dell'immagine. La tabella sarà tanto più grande quanto sarà grande in larghezza e lunghezza in pixel l'immagine che vogliamo creare.

- Creare un secondo array dove trasformo l'immagine del primo array nel formato GIF (&H47 &H49 &H46 &H38 &H39... ecc...)

- Inserire il secondo array in un ciclo (FOR...NEXT o DO...LOOP) per la sua lunghezza con Response.BinaryWrite GIFbyte(X)
Ovviamente X è la posizione del byte all'interno dell'array di dati che compongono la GIF.

Per la conversione dell'immagine non ho particolari problemi in quanto ho recuperato e adattato un vecchio programma creato in da me in Visual Basic che trasformava un logo x telefonino in GIF e viceversa utilizzando il mitico algoritmo LZW. Mi riprometto di posatre il file asp finale non appena lo sistemo a puntino.

Ovviamente dal punto di vista grafico non potrò usare usare comandi GDI ma nemmeno per questo ho problemi. Se si hanno nozioni di matematica non è difficile creare linee, curve, cerchi e rettangoli. Per quanto riguarda le lettere e i numeri è possibile fare in modo di inserirli in un ulteriore matrice in modo da disegnarli sull'immagine magari un po' distorti o comunque non in linea proprio come le password grafiche che si vedono in giro.
Fiorella Fortunato
- Il 99% dei problemi di un computer sta tra la sedia e la tastiera...
Avatar utente
fiorella.fortunato
Utente Junior
 
Post: 59
Iscritto il: 11/09/05 11:38

Postdi GAD » 04/11/06 12:18

Ma non ti stai complicando troppo la vita? ricorda che piu' il gioco e' complicato e piu' c'e' da impazzire nel caso di bug :aaah
Conviene mettere la form iniziale di login direttamente in .net e cosi' puoi usare la variabile di sessione senza dover inventare metodi alternativi per la sicurezza.
E la password non va mai messa ne in cookie ne in var di sessione, semplicemente ti devi basare sulla presenza della variabile di sessione e sul nome utente che contiene.

Es.
1)accedo dalla form di login, se azzecco i dati giusti creo una session["utente"] = "pippo";
altrimenti non creo un ciufolo.
2) navigo nel sito, a inizio pagina\onload metti una
if(session["utente"]==null)
response.redirect("login.asp");

cosi' se l'utente aveva associata una session che contiene il suo nome lo lasci navigare perche' sai che si era loggato, se invece non aveva nessuna variabile session sai a priori che non ha fatto il login e lo rispedisci diretto alla form di login
Quando l'ultimo albero sarà abbattuto,l'ultimo pesce catturato,l'ultimo fiume avvelenato,
soltanto allora gli uomini si accorgeranno chei soldi non possono essere mangiati
GAD
Moderatore
 
Post: 2184
Iscritto il: 22/09/02 14:36
Località: Nebbiosa

Postdi tekanet » 06/11/06 09:41

La soluzione mi piace! Asp puro e ingegnoso. Se la implementi e ti va, postala :D!

@GAD: non mi pare tu abbia colto il senso del discorso, prova a rileggere.
tekanet
Utente Senior
 
Post: 173
Iscritto il: 03/09/02 10:22
Località: Milano sud-ovest

Postdi hydra » 06/11/06 10:12

Tieni conto poi che se vuoi proteggere tutto il sito (o comunque l'applicazione) puoi anche modificare il web.config in modo che faccia tutto lui in automatico.
Codice: Seleziona tutto
<authentication mode="Forms"/>
     <forms loginUrl="login.aspx" timeout="20"/>
</authentication>
<authorization>
     <deny users="?"/>
</authorization>

In questo caso ASP.NET blocca l'accesso a tutti e rimanda alla pagina login.aspx (o quella che specifichi) e poi quando tu riesci ad autenticarti crea lui automaticamente il cookie di sessione che puoi gestire come vuoi. ;)
Avatar utente
hydra
Moderatore
 
Post: 7007
Iscritto il: 19/07/04 08:06
Località: Vallis Duplavis

Postdi tekanet » 06/11/06 10:30

:S.. aho ragà, l'applicazione è ASP, non .NET! E Fiorella non ha nessuna intenzione di farla in Asp.NET :D..
tekanet
Utente Senior
 
Post: 173
Iscritto il: 03/09/02 10:22
Località: Milano sud-ovest

Postdi hydra » 06/11/06 11:13

E' vero... Comunque se decidesse di passare a .NET sa che ci sono anche queste opzioni. :D
Avatar utente
hydra
Moderatore
 
Post: 7007
Iscritto il: 19/07/04 08:06
Località: Vallis Duplavis

Postdi fiorella.fortunato » 06/11/06 12:23

Ho letto i messaggi. Vi ringrazio per la disponibilità. :)

ASP.NET è un linguaggio nuovo è sto facendo un po' di fatica a capirlo per cui al momento preferisco lavorare sull'ASP. Almeno lavoro con gli attrezzi che ho e che so usare. Se poi devo usare il C#, linguaggio sul quale è stato creato il file ASPX, allora penso che la mia seconda lingua madre (l'arabo) sia sicuramente più facile da imparare... :lol:

La fase di sperimentazione dell'ultima mia idea sta andando avanti ma in modo lento. Mi ero semplicemente dimenticata una cosuccia da nulla... La routine che creai all'epoca gestiva le gif monocromatiche verde e nero. Ho dovuto ristudiarmi l'algoritmo LZW.

Invece non ho capito il discorso di Hydra su web.config.
Fiorella Fortunato
- Il 99% dei problemi di un computer sta tra la sedia e la tastiera...
Avatar utente
fiorella.fortunato
Utente Junior
 
Post: 59
Iscritto il: 11/09/05 11:38

Postdi tekanet » 06/11/06 13:18

Se hai bisogno comunque posta, mi piace l'idea della generazione della Gif..

Il discorso del web.config non è applicabile nel tuo caso. In pratica, hydra ti fa notare che in Asp.NET esiste un meccanismo automatico che sottomette la visualizzazione di pagine ad un login, via parametri impostati nel file di configurazione. Ma ripeto, non è applicabile ed è una cosa che se inizi a studiarti Asp.NET trovi quasi subito (in libri, in siti web, tutorial etc).

tK
tekanet
Utente Senior
 
Post: 173
Iscritto il: 03/09/02 10:22
Località: Milano sud-ovest

Postdi fiorella.fortunato » 25/03/07 02:36

Ero giunta all'epoca alla conclusione... appunti alla mano e stavo per postarla intorno alla metà di novembre... Poi sono dovuta partire per lavoro... Sono rientrata da pochi giorni e ho ripreso gli appunti... ma ho dovuto ristudiarmeli in quanto alcune nozioni le avevo del tutto dimenticate.

Non concentratevi tanto sulle immagini e sui caratteri che comunque non sono il massimo ma sull'applicabilità degli algoritmi e soprattutto sul funzionamento di quello che crea le GIF. A proposito: tanto di cappello all'inventore dell''algoritmo LZW che oltre a creare un dizionario nel file effettua anche una compressione nei bit (una compressione nella compressione) un genio!!!

Ecco la mia soluzione in due file (login.asp e pwdgrafica.asp):

login.asp è la schermata di LOGIN
Codice: Seleziona tutto
<%@ Language=VBScript %>
<% ENABLESESSIONSTATE=true %>
<%
 Randomize Timer
 ALFABETO                   = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
 CONTATORE                  = 0
 LETTEERAESTRATTA           = 0
 Session("passwordgrafica") = ""
 For CONTATORE = 1 To 6 'password a 6 caratteri alfanumerici maiuscoli casuali
  LETTEERAESTRATTA = CInt((36 - 1) * Rnd() + 1 ) '36 = 26 lettere alfabeto + 10 numeri
  Session("passwordgrafica") = Session("passwordgrafica") & Mid(ALFABETO, LETTEERAESTRATTA, 1)
 Next
%>
 <HTML>
  <HEAD></HEAD>
  <BODY TOPMARGIN="0" LEFTMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0" SCROLL="NO" onload="document.forms.login.Userid.focus()">
   <TABLE CELLSPACING="0" CELLPADDING="0" WIDTH="100%" HEIGHT="100%">
    <TR>
     <TD WIDTH="100%" HEIGHT="100%" ALIGN="CENTER" valign="middle" bgcolor="#008B8B">
      <!-- Inizio Tabella della login -->
      <TABLE BORDER="1" WIDTH="250" HEIGHT="200">
       <TR>
        <TD ALIGN="center" BGCOLOR="#FFFFFF">
         <FORM ACTION="auth.asp" METHOD="POST" NAME=login>
          <STRONG>USERNAME</STRONG><BR>
          <STRONG><INPUT TYPE="TEXT" NAME="Userid" SIZE="20" MAXLENGTH="30"></STRONG><BR>
          <STRONG>PASSWORD</STRONG><BR>
          <STRONG><INPUT TYPE="PASSWORD" NAME="Password" SIZE="20" MAXLENGTH="30"></STRONG><BR><BR>
          <STRONG>PASSWORD GRAFICA</STRONG><BR>
          <STRONG><INPUT TYPE="TEXT" NAME="PwdGraph" SIZE="20" MAXLENGTH="30"></STRONG><BR><BR>
          <INPUT TYPE="SUBMIT" VALUE="Accedi">
          <br><img src=pwdgrafica.asp><br><% =session("passwordgrafica") %>
         </FORM>
        </TD>
       </TR>
      </TABLE>
      <BR><BR><BR><BR><BR><BR>
     </TD>
    </TR>
   </TABLE>
  </BODY>
 </HTML>

pwdgrafica.asp è il bestione che ho partorito... :lol:
Codice: Seleziona tutto
<%
 Randomize(Timer)
 Dim GigaChar(6)
 Dim RigaImmagine(26)
 Dim DIZIONARIOINDICE(1500), DIZIONARIO(1500)
 ALFABETO                   = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
 Bit                        = 0
 CODA                       = ""
 CODICE                     = ""
 CONTATORE                  = 0
 CONTATORERIGA              = 0
 CONTENUTO                  = ""
 FINALE                     = 0
 FLAG                       = 0
 FOCALEDISTURBOY            = 0
 FOCALEDISTURBOX            = 0
 FOTOGRAMMA                 = ""
 IMAGINEASCII               = ""
 IMMAGINECOMPRESSA          = ""
 IMMAGINEGIF                = ""
 INDICE                     = 0
 INIZIO                     = 6
 INTESTAZIONE               = 0
 LETTEERAESTRATTA           = 0
 PEZZODISTRINGA             = ""
 POSIZIONE                  = 1
 STRINGABINARIA             = ""
 VALORE                     = 0

 ' SPAZIO = Bianco / # = Nero / . = Rosso
 GigaChar(0) = "  #  ####  ### #### ########## ### #   #  #      ##   ##    #   ##   # ### ####  ### ####  ### ######   ##   ##   ##   ##   ###### ###   #   ###  ###   ## ##### ### ##### ###  ### "
 GigaChar(1) = " # # #   ##   ##   ##    #    #   ##   #  #      ##   ##    ## ####  ##   ##   ##   ##   ##   #  #  #   ##   ##   ##   ##   #    ##   # ##  #   ##   # # # #    #   #    ##   ##   #"
 GigaChar(2) = "#   ##   ##    #   ##    #    #    #   #  #      ##  # #    # # ## # ##   ##   ##   ##   ##      #  #   ##   ##   # # # #   #   # # # ## #      #    ##  # #    #       # #   ##   #"
 GigaChar(3) = "######### #    #   ####  ###  # ########  #      ####  #    #   ##  ###   ##### #   #####  ###   #  #   ##   ## # #  #   # #   #  # # #  #    ##   ## ######### ####   #   ###  ####"
 GigaChar(4) = "#   ##   ##    #   ##    #    #   ##   #  #      ##  # #    #   ##   ##   ##    # # ##   #    #  #  #   ##   ## # # # #   #   #   # # #  #   #       #   #     ##   # #   #   #    #"
 GigaChar(5) = "#   ##   ##   ##   ##    #    #   ##   #  #  #   ##   ##    #   ##   ##   ##    #  ###   ##   #  #  #   # # # # # ##   #  #  #    #   #  #  #    #   #   # #   ##   ##    #   ##   #"
 GigaChar(6) = "#   #####  ### #### ######     ### #   #  #   ### #   #######   ##   # ### #     #####   # ###   #   ###   #   # # #   #  #  ##### ### ########## ###    #  ###  ### #     ###  ### "
 
 'Ora vado a creare un'immagine dove ogni '#' e ogni SPAZIO è largo 3 x 3 pixel (voglio creare un'immagine a larghezza tripla)
 'Aggiungo due spazi all'inizio e due alla fine mentre tra le lettere lo spazio è doppio
 'La dimensione finale della RigaImmagine è quindi larga (7 doppi spazi + 6 caratteri larghi 5) x 3 = 132 caratteri (pixel)
 'e alta 27 pixel (7 righe + una riga vuota iniziale e una finale) x 3

 For CONTATORE = 1 To 132
  RigaImmagine( 0) = RigaImmagine( 0) & " "
  RigaImmagine( 1) = RigaImmagine( 1) & " "
  RigaImmagine( 2) = RigaImmagine( 2) & " "
  RigaImmagine(24) = RigaImmagine(24) & " "
  RigaImmagine(25) = RigaImmagine(25) & " "
  RigaImmagine(26) = RigaImmagine(26) & " "
 Next

 For CONTATORERIGA = 3 To 23
  RigaImmagine(CONTATORERIGA) = "  "
  For CONTATORE = 1 To 6
   RigaImmagine(CONTATORERIGA) = RigaImmagine(CONTATORERIGA) & Mid(GigaChar(Int((CONTATORERIGA) / 3) - 1), ((Instr(ALFABETO, Mid(Session("passwordgrafica"), CONTATORE, 1)) - 1) * 5) + 1, 5) & "  "
  Next
  RigaImmagine(CONTATORERIGA) = Replace(Replace(RigaImmagine(CONTATORERIGA), "#", "###"), " ", "   ")
 Next

 FOCALEDISTURBOY = CInt((19 - 1) * Rnd() + 4 )
 FOCALEDISTURBOX = CInt((119 - 1) * Rnd() + 7 )
 
 For CONTATORERIGA = 0 To 26
  If FOCALEDISTURBOY >= CONTATORERIGA Then
   RigaImmagine(CONTATORERIGA) = Left(RigaImmagine(CONTATORERIGA), FOCALEDISTURBOX - 1) & Replace(Replace(Right(RigaImmagine(CONTATORERIGA), 132 - FOCALEDISTURBOX + 1), " " ,"."), "#", " ")
  Else
   RigaImmagine(CONTATORERIGA) = Replace(Replace(Left(RigaImmagine(CONTATORERIGA), FOCALEDISTURBOX - 1), " ", "."), "#", " ") & Right(RigaImmagine(CONTATORERIGA), 132 - FOCALEDISTURBOX + 1)
  End If
 Next

 INTESTAZIONE = "GIF89a" & Chr(132) & Chr(0) & Chr(27) & Chr(0) & Chr(145) & Chr(0) & Chr(0)
 INTESTAZIONE = INTESTAZIONE & Chr(0) & Chr(0) & Chr(0) & Chr(255) & Chr(0) & Chr(0)
 INTESTAZIONE = INTESTAZIONE & Chr(255) & Chr(255) & Chr(255) & Chr(0) & Chr(0) & Chr(0)

 FOTOGRAMMA = Chr(33) & Chr(249) & Chr(4) & Chr(5) & Chr(144) & Chr(1) & Chr(3) & Chr(0)
 FOTOGRAMMA = FOTOGRAMMA & Chr(44) & Chr(0) & Chr(0) & Chr(0) & Chr(0)
 FOTOGRAMMA = FOTOGRAMMA & Chr(132) & Chr(0) & Chr(27) & Chr(0) & Chr(0) & Chr(2)

 CODA = Chr(59) & Chr(0)

 For CONTATORERIGA = 0 To 26
   IMAGINEASCII = IMAGINEASCII & RigaImmagine(CONTATORERIGA)
 Next
 IMAGINEASCII = Replace(IMAGINEASCII, "#", Chr(0)) 'nero
 IMAGINEASCII = Replace(IMAGINEASCII, ".", Chr(1)) 'rosso
 IMAGINEASCII = Replace(IMAGINEASCII, " ", Chr(2)) 'bianco

 ' Codifico il File in un array creando un dizionario temporaneo
 For CONTATORE = 0 To 1500
  DIZIONARIOINDICE(CONTATORE) = 0
  DIZIONARIO(CONTATORE) = ""
 Next
 INIZIO = 6
 INDICE = 0
 POSIZIONE = 1
 For VALORE = 0 To 5
  DIZIONARIOINDICE(VALORE) = VALORE
 Next
 For VALORE = 0 To 2
  DIZIONARIO(VALORE) = Chr(VALORE)
 Next
 CODICE = ""
 FINALE = 0
 Do
  CODICE = CODICE & Mid(IMAGINEASCII, 1, 1)
  FLAG = 0
  For CONTATORE = 0 To INIZIO - 1
  If CODICE = DIZIONARIO(CONTATORE) Then
   FLAG = 1
   INDICE = CONTATORE
  End If
  Next
  If FLAG = 0 Or FINALE = 1 Then
   DIZIONARIOINDICE(INIZIO) = INDICE
   DIZIONARIO(INIZIO) = CODICE
   CODICE = ""
   INIZIO = INIZIO + 1
   If FINALE = 1 Then Exit Do
  End If
  If FLAG Then
   IMAGINEASCII = Mid(IMAGINEASCII, 2)
   If Len(IMAGINEASCII) = 0 Then FINALE = 1
  End If
 Loop
 ' Comprimo i dati mettendo un valore di apertura "4" e di chiusura "5"
 STRINGABINARIA = "100"
 For CONTATORE = 6 To INIZIO - 1
  If CONTATORE <= 2048 Then Bit = 11
  If CONTATORE <= 1024 Then Bit = 10
  If CONTATORE <= 512 Then Bit = 9
  If CONTATORE <= 256 Then Bit = 8
  If CONTATORE <= 128 Then Bit = 7
  If CONTATORE <= 64 Then Bit = 6
  If CONTATORE <= 32 Then Bit = 5
  If CONTATORE <= 16 Then Bit = 4
  If CONTATORE <= 8 Then Bit = 3
  For j = 0 To Bit - 1
   If DIZIONARIOINDICE(CONTATORE) And 2 ^ j Then
    STRINGABINARIA = "1" & STRINGABINARIA
   Else
    STRINGABINARIA = "0" & STRINGABINARIA
   End If
  Next
 Next
 If CONTATORE <= 2048 Then Bit = 11
 If CONTATORE <= 1024 Then Bit = 10
 If CONTATORE <= 512 Then Bit = 9
 If CONTATORE <= 256 Then Bit = 8
 If CONTATORE <= 128 Then Bit = 7
 If CONTATORE <= 64 Then Bit = 6
 If CONTATORE <= 32 Then Bit = 5
 If CONTATORE <= 16 Then Bit = 4
 If CONTATORE <= 8 Then Bit = 3
 For j = 0 To Bit - 1
  If 5 And 2 ^ j Then
   STRINGABINARIA = "1" & STRINGABINARIA
  Else
   STRINGABINARIA = "0" & STRINGABINARIA
  End If
 Next
 Do While Len(STRINGABINARIA) / 8 <> Int(Len(STRINGABINARIA) / 8)
  STRINGABINARIA = "0" & STRINGABINARIA
 Loop
 IMMAGINECOMPRESSA = ""
 For t = 1 To Len(STRINGABINARIA) - 7 Step 8
  a = Mid(STRINGABINARIA, t, 8)
  ax = 0
  For j = 1 To 8
   ax = Cint(Mid(a, 9 - j, 1)) * 2 ^ (j - 1) + ax
  Next
  IMMAGINECOMPRESSA = Chr(ax) & IMMAGINECOMPRESSA
 Next
 For CONTATORE = 1 To Len(IMMAGINECOMPRESSA) Step 254
  PEZZODISTRINGA = Mid(IMMAGINECOMPRESSA, CONTATORE, 254)
  If Len(PEZZODISTRINGA) = 0 Then Exit For
  CONTENUTO = CONTENUTO & Chr(Len(PEZZODISTRINGA)) & PEZZODISTRINGA
 Next
 CONTENUTO = CONTENUTO & Chr(0)

 IMMAGINEGIF = INTESTAZIONE & FOTOGRAMMA & CONTENUTO & CODA

 ' E lo mostro a video
 Response.Buffer = True
 Response.Expires = -1
 Response.ExpiresAbsolute = Now() - 2
 Response.CacheControl = "No-Store"
 Response.AddHeader "pragma","no-cache"
 Response.AddHeader "cache-control","private"
 Response.ContentType = "image/gif"

 For CONTATORE = 1 to Len(IMMAGINEGIF)
  Response.BinaryWrite ChrB(CLng("&H" & Hex(Asc(Mid(IMMAGINEGIF, CONTATORE, 1)))))
 next
 Response.Flush
%>


Ringrazio quel mattacchione di Ribonix per avermi dato assistenza e la documentazione necessaria, oltre ad aver creato la parte dei GigaChar, per arrivare velocemente a questa conclusione... Pensate, è riuscito a ricreare l'algoritmo LZW con Excel (caratteri compresi) :lol:
Fiorella Fortunato
- Il 99% dei problemi di un computer sta tra la sedia e la tastiera...
Avatar utente
fiorella.fortunato
Utente Junior
 
Post: 59
Iscritto il: 11/09/05 11:38

Postdi Ribonix » 25/03/07 09:07

Buon lavoro Fiore!!!

Non prenderla come critica, ma è un suggerimento per coloro che vogliono rielaborare i TUOI (perchè il grosso del lavoro è sempre stato tuo) sorgenti.

E' vero che i GigaChar fanno pena ma avendo tempo e pazienza si può creare un set di caratteri migliorato 15x21 senza ricorrere allo stratagemma di trasformare i miei caratteri 5x7 da "#" a "###", da SPAZIO a SPAZIOSPAZIOSPAZIO e triplicare il dato. Ma come ti dissi allora quel set aveva solo uno scopo demo.

Volendo avere ulteriore pazienza si potrebbe aggiungere altri elementi di disturbo nell'immagine e disallineare i caratteri in modo da render più difficile elaborare la GIF e decodificarne la pwd, ecc...

Il secondo programma si potrebbe ottimizzare nei passaggi ma rende molto l'idea di come procedere alla creazione di un file gif (testo->binario->file) e sprattutto rende chiari i passaggi per la codifica di un file GIF animata (GIF89a) in quadricromia. Sarebbe stato meglio creare una demo GIF a 16 colori ma rimandiamo tutti alle specifiche del GIF89a (gif89a.txt).

Darei una spiegazione riguardo la parte di codice che evidenzio più avanti, (ma basterebbe dare un'occhiata alle specifiche per capire) in quanto è questa che definisce in particolare le dimensioni del file, la persistenza di un frame all'interno di una gif animata, i colori utilizzati ecc.. ma rischiamo di andare OT.

fiorella.fortunato ha scritto:
Codice: Seleziona tutto
 INTESTAZIONE = "GIF89a" & Chr(132) & Chr(0) & Chr(27) & Chr(0) & Chr(145) & Chr(0) & Chr(0)
 INTESTAZIONE = INTESTAZIONE & Chr(0) & Chr(0) & Chr(0) & Chr(255) & Chr(0) & Chr(0)
 INTESTAZIONE = INTESTAZIONE & Chr(255) & Chr(255) & Chr(255) & Chr(0) & Chr(0) & Chr(0)

 FOTOGRAMMA = Chr(33) & Chr(249) & Chr(4) & Chr(5) & Chr(144) & Chr(1) & Chr(3) & Chr(0)
 FOTOGRAMMA = FOTOGRAMMA & Chr(44) & Chr(0) & Chr(0) & Chr(0) & Chr(0)
 FOTOGRAMMA = FOTOGRAMMA & Chr(132) & Chr(0) & Chr(27) & Chr(0) & Chr(0) & Chr(2)

 CODA = Chr(59) & Chr(0)

 CONTENUTO = CONTENUTO & Chr(0)

 IMMAGINEGIF = INTESTAZIONE & (FOTOGRAMMA & CONTENUTO) & CODA
Alla prossima... Inshallah!!!

P.S.: ho messo FOTOGRAMMA & CONTENUTO tra parentesi perchè, come ben sai, i due dati viaggiano in copia ad ogni frame che viene aggiunto ad una gif animata.
Allah Akhbar! Allah Akhbar! Allah Akhbar!
Avatar utente
Ribonix
Utente Senior
 
Post: 346
Iscritto il: 12/02/03 22:41
Località: 3GYPT

Postdi fiorella.fortunato » 25/03/07 10:21

Grazie Ribo.

In login.asp ho inserito volutamente questa parte di codice
Codice: Seleziona tutto
<img src=pwdgrafica.asp><br><% =session("passwordgrafica") %>
per dimostrare che l'immagine è identica alla variabile di sessione. Ovviamente bisogna eliminare la parte dopo "<br>".

Alla prox... Mashallah... :)
Fiorella Fortunato
- Il 99% dei problemi di un computer sta tra la sedia e la tastiera...
Avatar utente
fiorella.fortunato
Utente Junior
 
Post: 59
Iscritto il: 11/09/05 11:38


Torna a Programmazione


Topic correlati a "[ASP e ASP.NET] Variabili di sessione":


Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti