Applicazione complessa in un unico file

Eccomi con la domanda del secolo: sto tentando di costruire un sistema a step (passi) in cui l'utente, seguendo una guida, alla fine del percorso acquisti un bene online. Insomma una specie di carrello della spesa.

Dato che dovrò stare attento alla sicurezza del sistema, vorrei fare in modo che sempre meno dati rimangano nel computer del client.

Quindi i cookie che si rendono necessari alla procedura, dovrà  di fatto e se possibile essere solo un cokie di sessione che conterrà solo l'informazione della posizione corrente dell'utente all'interno della procedura di acquisto, o per farla breve, in quale step è arrivato. Fare questo è abbastanza facile.

I dolori arrivano quando devo gestire i passaggi tra una transizione di pagina e l'altra, senza utilizzare i cookie, ovvio potrei anche usare un database, ma vorrei che l'intera procedura resti semplice, quindi ho pensato ad un semplice array.

Un array che però non viene memorizzato in un cookie, quindi ad ogni transazione teoricamente, si cancellerebbe; allora ho pensato che richiamando il tutto da un'unico file php, forse non avrei questo problema.

Il tutto funzionerebbe tramite uno switch, che ad ogni passo (step) della procedura, richiama la pagina html da mostrare a video, e tramite questa l'utente fa le sue scelte. Premendo invio alla fine del form di inserimento dati, questi vengono inviati alla pagina del server, che li tratta a seconda del caso.

Non ho ancora costruito nulla di tutto ciò, perché prima sto raccogliendo informazioni e quella che mi manca di più è al momento èla segunete: se costruisco un sistema del genere, comunque un array verrebbe ripopolato ad ogni step, pur essendo l'applicazione chiamante sempre la stessa, così come accade se si utilizzano più file? Oppure proprio perché l'applicazione è costituita sempre dallo stesso file, questo, l'array cioè, riuscirebbe a non inizializzarsi ad ogni chiamata, impedendomi così i dover utilizzare un database fisso?

PS ci avete capito qualcosa? :D

inviato 10 anni fa
Marco Grazia
X 0 X

Sinceramente non ci ho capito molto, cmq, non ti puoi tenere in sessione l'array?

Inoltre, da quanto ho capito metti in un cookie lo step in cui è l'utente, giusto?Non conviene mettere in sessione anche questo dato?

Alla fine, quello che ti voelvo dire...non conviene gestire il carrello con delle sessioni?E solo alla fine, se ti serve avere uno storico degli acquisti, mettere nel DB gli acquisti associati all'id dell'utente?

E' solo un'idea, poi dipende da come vuoi strutturare tu il carrello...

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Vorrei evitare di fare su e giù per la rete di dati sensibili, quindi va bene quando l'utente li inserisce, ma poi evitare che vadano su e giù anche con i cookie.

Inviare lo step, non è certo un dato importante, dato che comunque si riferisce solo al punto della procedura a cui è arrivato l'utente.

Ma tenere sul client dei cookie con dati sensibili è un'altra cosa, penso che alla fine utilizzerò il database o un file temporaneo, ma mi sarebbe piaciuto utilizzare un array per la facilità con cui si possono gestire, tutto qui.

risposto 10 anni fa
Marco Grazia
X 0 X

Vorrei evitare di fare su e giù per la rete di dati sensibili, quindi va bene quando l'utente li inserisce, ma poi evitare che vadano su e giù anche con i cookie.

Inviare lo step, non è certo un dato importante, dato che comunque si riferisce solo al punto della procedura a cui è arrivato l'utente.

Ma tenere sul client dei cookie con dati sensibili è un'altra cosa,

Perfettamente daccordo.

penso che alla fine utilizzerò il database o un file temporaneo, ma mi sarebbe piaciuto utilizzare un array per la facilità con cui si possono gestire, tutto qui.

Forse non mi ero spiegato io...ti dicevo appunto quello, ossia utilizzare un array per memorizzare i servizi inseriti dall'utente nel carrello e mettere questo array in sessione, ad esempio:

$_SESSION['carrello']['IDservizio'] = array("prezzo","qnty","descrizione"....) o cmq una cosa del genere...

potrebbe andarti bene una soluzione così?

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Era proprio quello che volevo scartare a priori, cioè usare un array in sessione.

Ma pensandoci e affidandomi all'UCAS, potrei benissimo utilizzare un array di sessione in cui non ci sono i veri dati utente ma solo un riferimento alla posizione dove si trovino.

So che è un po' macchinoso, ma ho bisogno che tali dati restino quanto più riservati possibile.

risposto 10 anni fa
Marco Grazia
X 0 X

Era proprio quello che volevo scartare a priori, cioè usare un array in sessione.

Ma pensandoci e affidandomi all'UCAS, potrei benissimo utilizzare un array di sessione in cui non ci sono i veri dati utente ma solo un riferimento alla posizione dove si trovino.

So che è un po' macchinoso, ma ho bisogno che tali dati restino quanto più riservati possibile.

Un bel po' macchinoso, sarebbe creare un xml con tutti i servizi, ogni blocco (ogni servizio), sarebbe identificato da una posizione, esempio:

<service pos="0">
 <price>1234</price>
 <qnty>3</qnty>
</service>
<service pos="1">
 <price>567</price>
 <qnty>2</qnty>
</service>

Estrapoli i dati dall'xml e li visualizzi per farli scegliere dall'utente, passandogli la posizione del servizio, poi interrogando l'xml ti estrapoli i dati che ti servono e crei l'array...

Ok, un po' complicato  :P

CMQ a parte questa ipotesi, se non ti vuoi portare dietro dati sensibili in sessione, la vedo dura senza utilizzare un DB.

ciao

Lorenzo

risposto 10 anni fa
Lore
Lore
1
X 0 X

No anzi, l'ho già realizzato, e funziona gregiamente, il problema semmai è cancellare il file xml quando la sessione cade, o perché l'utente chiude il client, o perché annulla la sessione.

risposto 10 anni fa
Marco Grazia
X 0 X
No anzi, l'ho già realizzato, e funziona gregiamente, il problema semmai è cancellare il file xml quando la sessione cade, o perché l'utente chiude il client, o perché annulla la sessione.

Esatto, quello è un problema, o meglio, se si trattasse solo di distruggere l'xml quando scade la sessione, di potrebbe fare un controllo in tutte le pagine

if(!isset($_SESSION['xxx']))
 {
    //cancella xml
 }

invece per cancellare l'xml quando l'utente chiude il browser, credo che dovresti creare nel DB una tabella in cui registri tutte le sessioni con un flag che dica se sono attive o meno, poi fare una sorta di script, una specie di robot che conitnui ad interrogare il DB e faccia un ciclo per vedere se la sessione è ancora attiva, in caso contrario, cancellare il file.

Ora che ci penso, potresti fare in modo che questa cosa venga fatta ogni ora, una volta ogni giorno o una volta ogni tot...non so, cmq mi pare una soluzione un po' complicata.

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Mi pare una cosa assurda, senza offesa, ma credo che se utilizzo un database, tanto vale mettere tutto in un database, ma non solo, credo che convenga monitorare se attivo il cookie di sessione che controlla lo step, se è ancora disponibile (get_cookie) allora continua, se no ... cancella il record. O no?

risposto 10 anni fa
Marco Grazia
X 0 X
Mi pare una cosa assurda, senza offesa, ma credo che se utilizzo un database, tanto vale mettere tutto in un database, ma non solo, credo che convenga monitorare se attivo il cookie di sessione che controlla lo step, se è ancora disponibile (get_cookie) allora continua, se no ... cancella il record. O no?

Si, infatti come idea da applicare era assurda...ed il cookie, l'avevo completamente dimenticato  :2funny:

Va bhe, era un'idea data dalla prossimità delle vacanze, ossia, il corpo è al lavoro e la mente è già in vacanza... :D

CMQ, quando avrai deciso come fare, posta la soluzione che hai trovato!

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Non preoccuparti, la mia mente è già in vacanza, lei, io invece sto ancora qui.

appena trovo una soluzione praticabile, la metto qui.

risposto 10 anni fa
Marco Grazia
X 0 X

perché evitate di memorizzare tutto in sessione? E' il posto più sicuro  :dunno:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
perché evitate di memorizzare tutto in sessione? E' il posto più sicuro  :dunno:

Ciao Gianni...si cercava di trovare una soluzione alternativa perchè voleva evitare il salvataggio in sessione...cmq allargando il discorso, quali controindicazioni ci potrebbero essere ad utilizzare le sessioni?

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

L'unico problema che si può verificare se si abbonda con il salvataggio di dati in sessione è....un consumo di spazio su disco. Niente più.

L'alternativa (al consumo di spazio) non è certo quella di utilizzare metodi alternativi di memorizzazione, poiché richiedono comunque spazio, a volte maggiore (XML&C.)

Se i dati non sono delicati bisogna indirizzarsi verso l'uso dei cookie, il sistema più scalabile in assoluto (si usano gli HD dei client e non quelli del server)

Non c'è altro.

P.S.: queste considerazioni le ho trovate sui libri di PHP e ASP.NET, quindi le ritengo universali  ;D

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

infatti... poi al max dai un okkiata anche a questa classe...

http://www.phpclasses.org/browse/package/2794.html

risposto 10 anni fa
Xscratch
X 0 X

L'unico problema che si può verificare se si abbonda con il salvataggio di dati in sessione è....un consumo di spazio su disco. Niente più.

L'alternativa (al consumo di spazio) non è certo quella di utilizzare metodi alternativi di memorizzazione, poiché richiedono comunque spazio, a volte maggiore (XML&C.)

Se i dati non sono delicati bisogna indirizzarsi verso l'uso dei cookie, il sistema più scalabile in assoluto (si usano gli HD dei client e non quelli del server)

Ok, queste le sapevo, pensavo ci fossero controindicazioni a livello di sicurezza...

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Le sessioni sono lo strumento relativamente più sicuro a disposizione. Al client arriva solo un numerino.

Se le sessioni sono su DB allora i dati sono blindati

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Le sessioni sono lo strumento relativamente più sicuro a disposizione. Al client arriva solo un numerino.

Se le sessioni sono su DB allora i dati sono blindati

 :bye:

Questo mi ero chiaro, però dato che Marcolino voleva evitare di utilizzarle ( e dai post che ho letto sembra uno che ne sa ), mi ha fatto pensare che ci fosse qualche controindicazione che non conoscessi.

Grazie1000.

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Questo mi ero chiaro, però dato che Marcolino voleva evitare di utilizzarle ( e dai post che ho letto sembra uno che ne sa ), mi ha fatto pensare che ci fosse qualche controindicazione che non conoscessi.

Grazie1000.

ciao

Lore

Aspettiamo allora la sua risposta così ne discutiamo insieme.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Oddio, uno che ne sa, devo stare molto più attento a quello che scrivo :)

La mia risposta è che qualsiasi cosa usi si può rompere, ovvero nel caso di internet è bucabile; posso indubbiamente utilizzare il database, ma volevo evitare di utilizzare un database per dati transitori, ma per il fatto che è difficile monitorare quando un client si sconnette dalla sessione, rischierei di trovarmi il filesystem pieno di file inutili.

Il file XML è un'ottima idea per dati transitori se trovi il modo di cancellarlo quando la sessione non c'è più, altra idea era quella di utilizzare sqlite con lo stesso scopo.

Allora, la mia idea che è poco più che un abbozzo per ora, è quella di realizzare una procudera complessa con strumenti semplici, tenendo anche conto che l'utente potrebbe avere i cookie bloccati e quindi non utilizzabili.

Quindi c'è da verificare come prima cosa se il client accetta o meno i cookie e quindi reperire via get il "numerino", e anche controllare se questo è ancora il "numerino" e non sia stato invece alterato.

Per quest'ultimo "giochino" utilizzo la seguente espressione:

if(!preg_match('#^[[:alnum:]]+$#', $_COOKIE['session_id']))
  unset($_COOKIE['session_id']); // Non ci sono solo caratteri alfanumerici, quindi la sessione è stata alterata

hai visto mai che qualche furbetto, inserisca qualcosa come <script>eval ....eccetera alla fine della sessione sul GET?

Quindi tornando a bomba, ho bisogno di studiare un metodo semplice ma efficace; per ora sto orientandomi sempre più verso il database, solo mi scoccia di aprire un database solo per l'uso di questa sessione e poi quando la transazione va a buon fine, riversare i dati sul database generale e cancellarli su quello di sessione; ma se è la strada più immediata, ok non c'è problema è che mi piace riciclare più che consumare :)

risposto 10 anni fa
Marco Grazia
X 0 X

PHP gestisce in maniera nativa e trasparente la trasmissione del sesssion ID attraverso query string e cookie (in funzione delle impostazioni del php.ini) quindi non devi preoccuparti di controllare il session id passato via URL.

In particolare il PHP preferisce usare i cookie, dopo aver verificato che funzionano, a discapito dell'URL. Se il PHP si accorge che i cookies non funzionano continua la sessione impiegando l'URL.

Ti consiglio di utilizzare le sessioni perché queste risolvono nel migliore dei modi possibili la cancellazione dei dati di sessione scaduti. Nel php.ini decidi la frequenza del garbage collector. Se pensi ad una tecnica alternativa di memorizzazione dati temporanei sul server ti ritroverai a pensare ad una gestione molto simile a quella delle sessioni di PHP.

Inoltre, se il salvataggio su file di testo ti sta stretto puoi sempre realizzare degle funzioni personalizzate e comunicarle a PHP con session_set_save_handler. In questo modo lascerai al PHP la trasmissione/ricezione del session e potrai gestire tutti i dettagli della lettura/scrittura/cancellazione dei dati di sessione.

In un gestionale PHP/MySQL ho dati di sessione salvati in un campo TEXT di MySQL, con dimensioni che superano i 5kb

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Non voglio toccare il php.ini in quanto sul server girano applicazioni condivise da più utenti, se modifico dei valori a mio vantaggio, potrei causare problemi a qualcun altro.

Proverò a gestire la cosa alla vecchia maniera, cioè gestendo l'array con i cookie, ovvero le sessioni e vedremo; in questo modo no avrò bisogno di una "fogna" (garbage collector) perché alla chiusura della sessione si chiude anche l'array ;)

Vi faccio sapere appena ho aggiustato il cvs  :knuppel:

risposto 10 anni fa
Marco Grazia
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda